暂时禁用来自第三方dll的控制台输出
Temporarly disabling Console output from a 3rd party dll
我有一个win32控制台应用程序,它使用了第三方dll的功能,我没有源代码。当从这个特定的dll调用导出函数时,我的控制台中充满了来自导出方法的消息。
是否有办法禁用控制台输出"本地化"的第三方dll?当然,原始dll"加载器"进程(我的应用程序)必须仍然能够提供控制台输出,因为它被需要解释控制台的客户端脚本工具包作为子进程调用。所以你可以想象,如果我把不受控制的控制台输出传递给这个父进程,事情可能会出错。
我试过这篇文章的答案:禁用外部程序的控制台输出(c++)是这样的:system( "3rdparty.dll >nul 2>nul" )
;
您可以在调用第三方库之前将stdout
和stderr
重定向到一个文件,然后再将它们重定向回来。
你可以这样写一个类:(这是为Windows和Visual c++。其他类似posix的环境需要稍微不同的代码。)
class RedirectStandardOutputs {
private:
int m_old_stdout, m_old_stderr;
public:
RedirectStandardOutputs (char const * stdout_name, char const * stderr_name)
: m_old_stdout (-1), m_old_stderr (-1)
{
fflush (stdout);
fflush (stderr);
m_old_stdout = _dup(_fileno(stdout));
m_old_stderr = _dup(_fileno(stderr));
freopen (stdout_name, "wb", stdout);
freopen (stderr_name, "wb", stderr);
}
~RedirectStandardOutputs ()
{
fflush (stdout);
fflush (stderr);
_dup2 (m_old_stdout, _fileno(stdout));
_dup2 (m_old_stderr, _fileno(stderr));
}
};
还要记住,您需要同时包含<stdio.h>
和<io.h>
。
stdout
和stderr
重定向到普通文件,并在析构函数中恢复它们。你可以这样使用:
// This function writes stuff to the console:
void Foo (int i)
{
printf ("(%d) Hello, world!n", i);
fprintf (stderr, "(%d) Hello, again.n", i);
}
// ...
// Later, you call the Foo() function three times, but only the
// second one is redirected:
Foo (0);
{
RedirectStandardOutputs rso ("x.txt", "y.txt");
Foo (1);
}
Foo (2);
请注意,这可能不是很快(特别是在Windows上),所以请将其放在性能敏感区域之外。
如果你想禁用写入控制台,而不是将它们重定向到一个文本文件,你仍然可以使用这种方法,但你必须传入字符串"NUL"
作为文件名,即:
RedirectStandardOutputs rso ("NUL", "NUL");
相关文章:
- 挂起和取消挂起一个文件DLL
- C++:将控制台输出存储在宏中更好吗
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 如何将从控制台应用程序C++回调设置为C++ COM DLL
- 将C /CLI DLL导入C Win32控制台(Unmanage)
- 缺少新的空VC 控制台项目的MFC71.dll
- C++(DLL)与C#控制台应用程序的交互问题
- DLL 导致"Microsoft Excel has stopped working"但它在 Win32 控制台应用中工作正常
- 程序无法启动,因为您的计算机中缺少libgcc_s_dw2-1.dll。简单的控制台
- 禁止从导入的 DLL 打印控制台
- 如何从C++控制台应用程序中使用shell32.dll
- Visual studio 2015.c++控制台应用程序转换在安装项目与所有dll
- 从DLL写入控制台
- 可视化 打开并从C++ DLL 写入控制台
- 暂时禁用来自第三方dll的控制台输出
- 将c++ /Win32控制台应用程序转换为DLL后崩溃
- 在比较 Windows、控制台、静态库和 DLL C++时,后两者的用途是什么?