2009-03-10 5 views
3

Ich schreibe eine win32-Dienstprogrammfunktion für unser Produkt, das ein beliebiges Programm über die Shell aufrufen und seine Ausgabe protokollieren muss. Wir tun dies, indem Sie die Standardausgabe aus dem untergeordneten Prozess in ein Rohr umgeleitet:Win32: Ermitteln, ob stdout handle char oder wchar Stream ist

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

Es gibt eine Vielzahl von Programmen, die auf diese Weise aufgerufen werden können, von denen viele nicht unter unserer Kontrolle. Derzeit sehen wir ein Problem, bei dem die Ausgabe vieler Programme nach dem ersten Zeichen abgeschnitten scheint - normalerweise ein sicheres Zeichen dafür, dass fälschlicherweise eine WCHAR-Zeichenfolge als CHAR verwendet wird.

Wie kann ich feststellen, ob der untergeordnete Prozess in seine Stdout-Pipe als CHAR oder WCHAR schreibt?

Antwort

3

Die Quintessenz ist, gibt es keine 100% zuverlässige Möglichkeit, dies zu tun. Die Eingabe-/Ausgabehandles eines Prozesses codieren nicht spezifisch. Sie arbeiten einfach auf einem Strom von Bytes. Es ist durchaus möglich, dass ein Prozess eine Weile ASCII schreibt und später zu Unicode wechselt.

Leider ist es nicht möglich, aus einem Bytestrom mit 100% Genauigkeit zu ermitteln, was die zugrunde liegende Kodierung ist. Die einzige Möglichkeit, dies zu bestimmen, ist ein Handshake-Protokoll, bei dem der Prozess Ihnen sagt, welche Codierung er verwenden wird. Wahrscheinlich keine Option in diesem Fall.

Links zum Thema

1

Ich denke, Sie müssen das aushandeln, wenn Sie eine Verbindung herstellen. Sie könnten PeekNamedPipe() verwenden und schätzen, wenn es wie ein Unicode-Zeichen aussieht ...

Verwandte Themen