2015-08-08 72 views
-1

我有一個WIN 32控制檯應用程序使用來自第三方dll的功能,我沒有源代碼。當從這個特定的DLL調用導出的函數時,我的控制檯充滿了源自導出方法的消息。暫時禁用第三方dll的控制檯輸出

有什麼辦法可以禁用第三方DLL的控制檯輸出「本地化」?當然,原始的dll「加載器」進程(我的應用程序)必須仍然能夠提供控制檯輸出,因爲它被客戶端腳本工具包稱爲子進程,需要解釋控制檯。所以你可以想象,如果我將非受控的控制檯輸出傳遞給這個父進程,事情可能會出錯。

我試圖從這個職位的答案: Disable Console Output from External Program (C++) 這樣的: system("3rdparty.dll >nul 2>nul"); 但它什麼也沒做。

回答

0

在調用第三方庫之前,您可以將stdoutstderr重定向到文件,然後將其重定向回來。

你可以寫這樣一個類:(這是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>和''。

上述類將stdoutstderr重定向到其構造函數中的普通文件,並將其恢復到其析構函數中。您可以使用它像這樣:

// 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"); 

希望這有助於。