3

シェルを介して任意のプログラムを呼び出し、その出力をログに記録する必要がある製品用の win32 ユーティリティ関数を作成しています。これを行うには、stdout を子プロセスからパイプにリダイレクトします。

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

このように呼び出される可能性のあるプログラムは多種多様であり、その多くは私たちの管理下にはありません。現在、多くのプログラムからの出力が最初の文字の後に切り捨てられているように見えるという問題が見られます。これは通常、WCHAR 文字列が誤って CHAR として使用されていることを示しています。

子プロセスがその stdout パイプに CHAR または WCHAR として書き込んでいるかどうかを確認するにはどうすればよいですか?

4

2 に答える 2

3

結論として、これを行うための 100% 信頼できる方法はありません。プロセスの入出力ハンドルはエンコーディング固有ではありません。それらは単にバイトのストリームで動作します。プロセスがしばらく ASCII を書き込んで、後で Unicode に切り替えることは完全に可能です。

残念ながら、バイト ストリームから 100% の精度で基になるエンコーディングを特定することはできません。これを判断する唯一の方法は、プロセスが使用するエンコードを通知するハンドシェイク プロトコルを使用することです。この場合、オプションではない可能性があります。

件名に関するリンク

于 2009-03-11T00:03:46.020 に答える
1

接続時に交渉する必要があると思います。PeekNamedPipe()を使用して、ユニコード文字のように見えるかどうかに基づいて推測できます...

于 2009-03-10T23:05:16.050 に答える