如何在另一个CRT库中重新路由std :: clog?

时间:2011-05-10 21:39:58

标签: c++ winapi dll unmanaged crt

我有一个使用VS2008构建的Win32程序,因此我的代码与MSVCR90.DLL和MSVCP90.DLL链接。但是,它也在用VS2005构建的DLL(我无法修改)中运行代码,当该DLL中的代码打印到clog流时,它通过MSVCR80.DLL和MSVCP80.DLL完成。这是问题:如果我在我的代码中重新路由std :: clog,我只会影响针对crt 9.0 libs构建的代码,使用旧版crt 8.0的代码不会重新路由其输出。那么有没有办法在针对旧CRT构建的DLL中重新路由阻塞流?

我已经研究了在较旧的CRT DLL上调用GetModuleHandle()和GetProcAddress()并设法重新路由C stderr流(通过_open_osfhandle和_dup2),但是C ++阻塞流似乎仍未受影响。我想我还需要在较旧的CRT lib中调用ios_base :: sync_with_stdio(),但是我无法获得该函数的有效地址。任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:0)

使用VS2005构建一个帮助DLL - 这个DLL应该只导出一些函数来进行VS8运行时所需的设置。

答案 1 :(得分:0)

另请尝试freopen ...但也可能需要在较旧的CRT中调用它。 Eric建议使用帮助程序DLL是一种大规模的过度杀伤,只需使用GetProcAddress来获取指向VC8版本的指针。

最有效的选择是在首先启动流程时重定向标准流。

另一种可能性是延迟加载辅助DLL,并在加载之前执行流重定向。这样,当MSVCRT80加载时,它将附加到重定向的流。