Перенаправление cout в строковый поток из отладочной сборки DLL в сборку выпуска EXE

У меня есть потоковый текст из библиотеки DLL на std::cerr. Связывание EXE (через LoadLibrary()) с этой DLL необходимо для потоковой передачи текста.

Я использую VS90.

Я использую следующий класс в EXE для перенаправления:

struct cerr_redirect {
cerr_redirect( std::streambuf * new_buffer ) 
    : old( std::cerr.rdbuf( new_buffer ) )
{ }

~cerr_redirect( ) {
    std::cerr.rdbuf( old );
}

private:
std::streambuf * old;
};

Это работает нормально, если и DLL, и EXE созданы с использованием одной и той же конфигурации (либо Debug, либо Release). Однако при запуске EXE, созданного в Release, с DLL, созданной для отладки, перенаправление не работает, и ни один из cerr выходных данных, созданных в DLL, не попадает в EXE.

ИЗМЕНИТЬ

Библиотека времени выполнения связана динамически. DLL, созданная для отладки, связывается с «Многопоточной DLL-отладкой (/ MDd)», а встроенная в Release EXE-версия связана с «Многопоточной DLL (/ MD)».

Я подозреваю, что это причина такого поведения; Я считаю, что std::cerr живет в ЭЛТ. Таким образом, когда и DLL, и EXE используют один и тот же CRT, они используют одну и ту же std::cerr, в противном случае у каждой из них есть собственная копия.

Может ли кто-нибудь подтвердить, правильно ли я понимаю?

Если да, то я думаю, что решение моей проблемы состоит в том, чтобы определить мой собственный глобальный поток в EXE и позволить DLL перенаправить на него cerr. Или есть более изящное решение?


person JPh    schedule 08.09.2014    source источник
comment
Когда вы смешиваете сборки выпуска и отладки, это означает, что исполняемый файл и DLL используют разные среды выполнения. А с двумя разными средами выполнения есть два разных экземпляра std::cerr. Простой выход из этой привязки - прекратить смешивать выпускные и отладочные сборки.   -  person David Heffernan    schedule 08.09.2014
comment
Спасибо за комментарии. Проблема понятна.   -  person JPh    schedule 09.09.2014