У меня есть 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)», а Релиз — встроенные ссылки EXE на «Многопоточные библиотеки DLL (/ MD)».
Я подозреваю, что это является причиной такого поведения; я верю std::cerr
живет в ЭЛТ. Поэтому, когда и DLL, и EXE используют один и тот же CRT, они совместно используют один и тот же std::cerr
иначе у каждого из них есть своя копия.
Может ли кто-нибудь подтвердить правильность моего понимания?
Если это так, я думаю, что решение моей проблемы состоит в том, чтобы определить свой собственный глобальный поток в EXE и позволить перенаправлению DLL cerr
к этому. Или есть более элегантное решение?
Задача ещё не решена.