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?

Foi útil?

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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top