Win32: Determinar se pega saída padrão é char ou fluxo wchar
Pergunta
Eu estou escrevendo uma função de utilidade win32 para o nosso produto que precisa chamar um programa arbitrário via shell e log sua saída. Fazemos isso redirecionando o stdout do processo filho dentro de um tubo:
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);
Há uma grande variedade de programas que podem ser chamados desta forma, muitos dos quais não estão sob nosso controle. Atualmente nós estamos vendo um problema em que a saída de muitos programas parece ser truncado após o primeiro caractere --- geralmente um sinal claro de que uma corda WCHAR é erroneamente sendo usado como um CHAR.
Como posso dizer se o processo filho está escrevendo para o seu tubo de stdout como um CHAR ou um WCHAR?
Solução
A linha inferior é não há nenhuma maneira 100% confiável para fazer isso. As alças de um processo de entrada / saída não está a codificar específico. Eles simplesmente operar em um fluxo de bytes. É completamente possível para um processo de escrever ASCII por algum tempo e mudar para Unicode mais tarde.
Infelizmente não é possível dizer a partir de um fluxo de bytes com 100% de precisão o que a codificação subjacente é. A única maneira de determinar isso é ter um protocolo de aperto de mão, onde o processo lhe diz o que codificação ele usará. Provavelmente não é uma opção neste caso.
Ligações sobre o assunto
Outras dicas
Eu acho que você tem que negociar que quando você se conectar. Você pode usar PeekNamedPipe () e adivinhar com base sobre se ele se parece com um personagem unicode ...