将cout重定向到从DLL的Debug构建到EXE的Release构建的字符串流

时间:2014-09-08 16:33:32

标签: c++ windows dll visual-studio-2008-sp1

我有一个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。还是有更优雅的解决方案?

0 个答案:

没有答案