2009-03-10 6 views
3

私は、シェルを介して任意のプログラムを呼び出してその出力をログする必要があるWin32ユーティリティー関数を作成しています。私たちは、パイプに子プロセスからの標準出力をリダイレクトすることによって、この操作を行います。Win32:stdoutハンドルがcharまたはwcharストリームかどうかを確認してください

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パイプに書き込んでいるかどうかをどのように確認できますか?

答えて

3

これを行うには100%確実な方法はありません。プロセスの入出力ハンドルは、特定のエンコーディングではありません。それらは単純にバイトストリームで動作します。プロセスがASCIIをしばらく書いて、後でUnicodeに切り替えることは完全に可能です。

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

リンク

1

私はあなたが接続するときにそれを交渉しなければならないと思います。 PeekNamedPipe()を使用して、ユニコード文字のように見えるかどうかを推測できます。

関連する問題