1

問題

windows.hとstd::coutを使用して、C++でコンソールの色を設定する方法を簡単に理解できました。そのような方法の1つを次に示します。

HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE); //get handle of console
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(stdout, &bufferInfo); //save current color scheme
SetConsoleTextAttribute(stdout, 0x4); //change console color
std::cout << "This is red text" << std::endl; 
SetConsoleTextAttribute(stdout, bufferInfo.wAttributes); //restore old colors

案の定、コンソールウィンドウからプログラムを実行すると、期待どおりに色が変わります。問題は、これがmsbuildスクリプトから実行される場合、execを使用することです。

<Exec Command="myExecutable.exe" />

msbuildスクリプトから実行する場合、色はプログラムの影響を受けません。std :: coutの呼び出しでもテキストは出力されますが、これは通常のコンソールウィンドウの色です。


仮説

私の推測では、execの呼び出しは、STD_OUTPUT_HANDLEとは異なるハンドルを介してstdoutに書き込みます。それか、msbuildexecが独自のコンソール属性を設定します。親コンソールを入手しようとしましたが、うまくいきませんでした。

何か案は?

4

1 に答える 1

2

最も可能性が高いのは、MSBuildが実行可能ファイルをパイプに接続することです。パイプに何かを書き込むと、MSBuildはもう一方の端からそれを読み取り、画面への書き込みやログへの書き込みなどの処理を実行する場合があります。問題は、パイプを介して色を転送できないことです。実際、を使用してstdoutハンドルがコンソールバッファーではないことを確認できますGetFileType。これはコンソールに戻りますFILE_TYPE_CHARFILE_TYPE_PIPE、私の仮説が正しければ。また、コンソール関数の呼び出しが成功したかどうかを確認する必要があります。

于 2013-01-31T18:36:12.370 に答える