我整天都在试图让我的MFC应用程序在屏幕上显示控制台应用程序的日志输出。从Visual Studio 2013的向导给我的开始,我能够修改他们的代码以获取字符串作为输入并生成应用程序消息的运行日志(下面):
void COutputWnd::FillBuildWindow(std::string build_text)
{
std::wstring wsTmp(build_text.begin(), build_text.end());
std::wstring z = wsTmp;
LPTSTR x = new TCHAR[z.size() + 1];
_tcscpy(x, z.c_str());
m_wndOutputBuild.AddString(x);
free(x);
}
但是,出于多种原因,我无法从MFC功能外部调用此功能。一个是对象在全局不可见,两个我在我的应用程序的控制台部分使用windows.h,它与MFC不能很好地配合。
我的大部分应用程序已经编写完了,我正在尝试在其周围放置GUI并使用功能区功能。有没有办法获取cout语句并将它们传递到我的MFC应用程序中的消息日志显示?我今天搜索了大量的东西,并没有找到任何直接或明确的应用程序,其中MFC和控制台代码作为其解决方案的一部分。我没有调用单独的可执行文件或DLL。这些都是作为一个独立的exe编译的。
答案 0 :(得分:3)
我不知道MFC,但我会从std::streambuf
派生一个类,将其输出重定向到MFC类,并将生成的流缓冲区安装到std::cout
。流缓冲区处理写入流的输出,您可以使用overflow()
和sync()
方法获取写入的字符:
class windowbuf
: std::streambuf {
SomeHandle handle;
char buffer[256];
public:
typedef std::char_traits<char> traits;
windowbuf(SomeHandle handle): handle(handle) { this->setp(buffer, buffer + 255); }
int overflow(int c) {
if (!traits::eq_int_type(c, traits::eof())) {
*this->pptr() = traits::to_char_type(c);
this->pbump(1);
}
return this->sync() == -1? traits::eof(): traits::not_eof(c);
}
int sync() {
writeToHandle(this->handle, this->pbase(), this->pptr() - this->pbase());
this->setp(buffer, buffer + 255);
return 0;
}
};
以上是一个简单的流缓冲区,当缓冲区已满或刷新流时,它会传输由handle
标识的某个字符。我认为应该可以提出一些句柄和一个将字符传输到MFC窗口的写函数,尽管我对这部分一无所知。
要让std::cout
将其字符发送到上述流缓冲区,您只需将此流缓冲区安装到std::cout
,例如,使用
int main() {
SomeHandle handle = get_a_handle_from_somewhere();
std::streambuf* cout_rdbuf = std::cout.rdbuf(new windowbuf(handle));
// run your program here
std::cout.rdbuf(cout_rdbuf); // this should really be restored using RAII approaches
}
我认为像上面这种方法应该能够弥合一些写入std::cout
的代码与显示信息的代码的其他部分之间的差距。