1

std::cout を使用して画面に出力する C++ プログラムがあります。

時々、サービスとして実行する必要があります。Windows サービスとして実行しているときに cout の出力を確認する方法はありますか?

出力をファイルまたは何らかのデバッグ プログラムにリダイレクトするのが理想的です。

明らかに、cout をファイルに書き込む関数に置き換えることができます。おそらくそれが私が行うことですが、他の解決策があるかどうか知りたいです。

4

3 に答える 3

2

基本的に無限の選択肢があります。頭に浮かぶ最初のいくつか:

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基になるバッファーをファイルに置き換える

cplusplus.com の例:

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
于 2012-11-15T09:10:03.887 に答える
1

簡単な解決策はSetStdHandle(STD_OUTPUT_HANDLE, your_new_handle).

于 2012-11-15T11:54:47.057 に答える
0

次のようなことができます。

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());
}
于 2019-03-06T03:40:34.350 に答える