我有一个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)构建,这都可以正常工作。但是,当使用Debug内置DLL运行Release内置EXE时,重定向不起作用,并且DLL中的cerr
输出都不会到达EXE。
修改
运行时库是动态链接的。 Debug构建的DLL链接"多线程调试DLL(/ MDd)" Release发布了针对"多线程DLL(/ MD)"。
的EXE链接我怀疑这就是这种行为的原因;我相信std::cerr
生活在CRT中。因此,当DLL和EXE使用相同的CRT时,它们共享相同的std::cerr
,否则,它们每个都有自己的副本。
有人可以确认我的理解是否正确吗?
如果是这样,我认为我的问题的解决方案是在EXE中定义我自己的全局流,并让DLL重定向cerr
。还是有更优雅的解决方案?