我有一个动态加载插件 DLL 的 C++ 应用程序。DLL 通过 std::cout 和 std::wcout 发送文本输出。基于 Qt 的 UI 必须从 DLL 获取所有文本输出并显示它。流缓冲区替换的方法并不完全有效,因为由于运行时库的差异,DLL 可能具有不同的 cout/wcout 实例。因此,我应用了 Windows 特定的 STDOUT 重定向,如下所示:
StreamReader::StreamReader(QObject *parent) :
QThread(parent)
{
// void
}
void StreamReader::cleanUp()
{
// restore stdout
SetStdHandle (STD_OUTPUT_HANDLE, oldStdoutHandle);
CloseHandle(stdoutRead);
CloseHandle(stdoutWrite);
CloseHandle (oldStdoutHandle);
hConHandle = -1;
initDone = false;
}
bool StreamReader::setUp()
{
if (initDone)
{
if (this->isRunning())
return true;
else
cleanUp();
}
do
{
// save stdout
oldStdoutHandle = ::GetStdHandle (STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE == oldStdoutHandle)
break;
if (0 …Run Code Online (Sandbox Code Playgroud)