我有一个WIN 32控制台应用程序,它使用第三方dll的功能,我没有源代码。从这个特定的dll调用导出的函数时,我的控制台中充满了源自导出方法的消息。
有没有办法禁用第三方dll的“本地化”控制台输出?当然,原始dll“加载器”进程(我的应用程序)仍然必须能够提供控制台输出,因为它被需要解释控制台的客户端脚本工具包称为子进程。所以你可以想象如果我将Uncontrolled控制台输出传递给这个父进程就会出错。
我试过这篇文章的答案:
Disable Console Output from External Program (C++)
像这样:
system( "3rdparty.dll >nul 2>nul" )
;
但它什么也没做。
答案 0 :(得分:0)
您可以在调用第三方库之前将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>
和&#39;&#39;。
上面的类将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");
希望这有帮助。