2015-08-08 3 views
-1

У меня есть консоль WIN 32, которая использует функциональные возможности от сторонней DLL, для которой у меня нет исходного кода. При вызове экспортируемой функции из этой конкретной DLL моя консоль заполняется сообщениями, исходящими из экспортируемого метода.Временное отключение вывода консоли из сторонней DLL

Есть ли способ отключить вывод консоли «localized» для DLL третьей стороны? Конечно, процесс «загрузчика» Original dll («Мое приложение») должен по-прежнему иметь возможность предоставлять консольный вывод, поскольку он называется подпроцессом с помощью инструментария сценариев для клиентов, который должен интерпретировать консоль. Таким образом, вы можете себе представить, что если я передаю неконтролируемый вывод консоли на этот родительский процесс, все может пойти не так.

Я попробовал ответ от этого поста: Disable Console Output from External Program (C++) как это: system("3rdparty.dll >nul 2>nul"); , но он ничего не делает.

ответ

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> и ''.

Вышеупомянутый класс перенаправляет как 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"); 

Надеюсь, что это поможет.

Смежные вопросы