std::cout を使用して画面に出力する C++ プログラムがあります。
時々、サービスとして実行する必要があります。Windows サービスとして実行しているときに cout の出力を確認する方法はありますか?
出力をファイルまたは何らかのデバッグ プログラムにリダイレクトするのが理想的です。
明らかに、cout をファイルに書き込む関数に置き換えることができます。おそらくそれが私が行うことですが、他の解決策があるかどうか知りたいです。
基本的に無限の選択肢があります。頭に浮かぶ最初のいくつか:
ostream 参照を渡す
std::ostream 参照を渡すことができます。
void someFunc(std::ostream& out) {
//someFunc doesn't need to know whether out is a file, cout, or whatever
out << "hello world" << std::endl;
}
cout
基になるバッファーをファイルに置き換える
streambuf *psbuf, *backup;
ofstream filestr;
filestr.open ("test.txt");
backup = cout.rdbuf(); // back up cout's streambuf
psbuf = filestr.rdbuf(); // get file's streambuf
cout.rdbuf(psbuf); // assign streambuf to cout
cout << "This is written to the file";
freopen には 1 ライナーがありますが、stdin と cout が同期されていない可能性があるため、未定義の動作であるという忍び寄る感覚があります (これはコメントでそれを強化しているようです)。
freopen("/path/to/file", "r", stdout);
//cout is now writing to path/to/file
ロギング ライブラリ
私の頭の中で良いものかどうかはわかりませんが、全力を尽くして何らかのタイプのロギング ライブラリを使用することができます。(Windows イベントもありますが、出力する内容によっては意味をなさない場合があります。)
配管
これが Windows サービスで可能かどうかは疑問ですが、可能であれば、常に従来のリダイレクトがあります。
blah.exe > C:\path\file
簡単な解決策はSetStdHandle(STD_OUTPUT_HANDLE, your_new_handle)
.
次のようなことができます。
class MyTerminal {
std::stringstream terminalText;
}
class MyWindow {
public:
void OnUpdate();
protected:
CTextbox m_textbox;
MyTerminal m_terminal;
}
void MyWindow::OnUpdate()
{
m_textBox.setText(m_terminal.terminalText.str());
m_terminal.terminalText.str(std::string());
}