문제

쉘을 통해 임의 프로그램을 호출하고 출력을 기록 해야하는 제품에 대한 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 () 그리고 유니 코드 문자처럼 보이는지 추측하십시오 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top