Win32:stdoutハンドルがcharストリームかwcharストリームかを判別
質問
シェルを介して任意のプログラムを呼び出し、その出力をログに記録する必要がある製品用の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として使用されていることの確実な兆候です。
子プロセスがCHARまたはWCHARとしてstdoutパイプに書き込みを行っているかどうかを確認するにはどうすればよいですか?
解決
結論として、これを行うための100%信頼できる方法はありません。プロセスの入力/出力ハンドルはエンコード固有ではありません。彼らは単にバイトのストリームで動作します。プロセスがしばらくの間ASCIIを記述し、後でUnicodeに切り替えることは完全に可能です。
残念ながら、バイトストリームから100%の精度で、基礎となるエンコーディングを特定することはできません。これを判断する唯一の方法は、ハンドシェイクプロトコルを使用して、プロセスが使用するエンコーディングを通知することです。この場合、オプションではない可能性があります。
件名のリンク
他のヒント
接続するときに、それについて交渉する必要があると思います。 PeekNamedPipe()を使用して推測することができますユニコード文字のように見える場合は...
所属していません StackOverflow