Win32 : stdout 핸들이 char 또는 wchar stream인지 확인
문제
쉘을 통해 임의 프로그램을 호출하고 출력을 기록 해야하는 제품에 대한 Win32 유틸리티 기능을 작성하고 있습니다. 우리는 Child Process에서 STDOUT를 파이프로 리디렉션하여 다음을 수행합니다.
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
CreatePipe(&hReadPipe, &hWritePipe, &saAttr, 0);
// Redirect the first process stdout to our write pipe
// so that we can read its output from the read pipe.
startUpInfo.dwFlags = STARTF_USESTDHANDLES;
startUpInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startUpInfo.hStdOutput = hWritePipe;
startUpInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
CreateProcessA(NULL, szCmdLine, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startUpInfo[i], &procInfo);
이런 방식으로 불리는 다양한 프로그램이 있으며, 그 중 다수는 우리의 통제하에 있지 않습니다. 현재 우리는 첫 번째 캐릭터 이후에 많은 프로그램의 출력이 잘린 것처럼 보이는 문제를보고 있습니다. 일반적으로 WCHAR 문자열이 실수로 숯으로 사용된다는 확실한 신호입니다.
아동 프로세스가 Char 또는 WCHAR로 STDOUT 파이프에 글을 쓰고 있는지 어떻게 알 수 있습니까?
해결책
결론은이 작업을 수행하는 100% 신뢰할 수있는 방법이 없다는 것입니다. 프로세스의 입력/출력 핸들은 구체적으로 인코딩되지 않습니다. 그들은 단순히 바이트 스트림에서 작동합니다. 프로세스가 잠시 동안 ASCII를 작성하고 나중에 유니 코드로 전환 할 수 있습니다.
불행히도 기본 인코딩이 무엇인지 100% 정확도로 바이트 스트림에서 알 수 없습니다. 이것을 결정하는 유일한 방법은 프로세스가 어떤 인코딩을 사용할 것인지 알려주는 손 쉐이크 프로토콜을 갖는 것입니다. 이 경우 옵션이 아닐 수도 있습니다.
주제에 대한 링크
다른 팁
연결할 때 협상해야한다고 생각합니다. 당신은 사용할 수 있습니다 peeknamedpipe () 그리고 유니 코드 문자처럼 보이는지 추측하십시오 ...
제휴하지 않습니다 StackOverflow