Перенаправление cout в stringstream из отладочной сборки 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)», а Релиз — встроенные ссылки EXE на «Многопоточные библиотеки DLL (/ MD)».

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

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

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

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]