Pregunta

Estoy escribiendo una función de utilidad win32 para nuestro producto que necesita llamar a un programa arbitrario a través del shell y registrar su salida. Hacemos esto redirigiendo el stdout del proceso hijo a una tubería:

    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);

Hay una amplia variedad de programas que se pueden llamar de esta manera, muchos de los cuales no están bajo nuestro control. Actualmente estamos viendo un problema en el que la salida de muchos programas parece estar truncada después del primer carácter, generalmente una señal segura de que una cadena WCHAR se está utilizando por error como CHAR.

¿Cómo puedo saber si el proceso secundario está escribiendo en su canalización estándar como CHAR o WCHAR?

¿Fue útil?

Solución

La conclusión es que no hay una forma 100% confiable de hacer esto. Los manejadores de entrada / salida de un proceso no están codificando específicamente. Simplemente operan en una secuencia de bytes. Es completamente posible que un proceso escriba ASCII por un tiempo y luego cambie a Unicode.

Desafortunadamente no es posible distinguir de una secuencia de bytes con una precisión del 100% cuál es la codificación subyacente. La única forma de determinar esto es tener un protocolo de saludo manual donde el proceso le indica qué codificación utilizará. Probablemente no sea una opción en este caso.

Enlaces sobre el tema

Otros consejos

Creo que tienes que negociar eso cuando te conectas. Puede usar PeekNamedPipe () y adivinar si parece un carácter unicode ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top