Frage

Ich bin ein win32 Nutzenfunktion für unser Produkt zu schreiben, die ein beliebiges Programm über die Shell aufrufen muss, und sein Ausgang anmelden. Wir tun dies, indem Sie die Standardausgabe aus dem untergeordneten Prozess in ein Rohr umgeleitet:

    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. Zur Zeit sind wir ein Problem zu sehen, wo die Ausgabe von vielen Programmen erscheint nach dem ersten Zeichen abgeschnitten werden --- in der Regel ein sicheres Zeichen, dass eine WCHAR Zeichenfolge fälschlicherweise als CHAR verwendet wird.

Wie kann ich feststellen, ob das Kind Prozess als CHAR oder WCHAR sein stdout Rohr schreibt?

War es hilfreich?

Lösung

Das Endergebnis ist, gibt es keinen 100% zuverlässig Weg, dies zu tun. Die Eingabe / Ausgabe-Handles eines Prozesses codieren nicht spezifisch. Sie arbeiten einfach auf einen Strom von Bytes. Es ist vollständig möglich, dass ein Prozess für eine Weile ASCII zu schreiben und später in Unicode wechseln.

Leider ist es nicht möglich, aus einem Strom von Bytes mit 100% Genauigkeit zu sagen, was die zugrunde liegende Codierung ist. Der einzige Weg, dies zu bestimmen, ist eine Hand-Shake-Protokoll haben, wo der Prozess der Ihnen sagt, welche Kodierung es verwenden wird. Wahrscheinlich keine Option in diesem Fall.

Links zum Thema

Andere Tipps

Ich glaube, Sie haben zu verhandeln, dass, wenn Sie eine Verbindung herstellen. Sie könnten verwenden PeekNamedPipe () und erraten, basierend auf, wenn es wie ein Unicode-Zeichen aussieht ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top