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

How to re-route std::clog in another CRT lib?

本文关键字:路由 std clog 新路由 另一个 CRT      更新时间:2023-10-16

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

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

谢谢。

使用 VS2005 构建帮助程序 DLL - 此 DLL 应仅导出一些函数来执行 VS8 运行时所需的设置。

也试试freopen...但这也可能需要在较旧的 CRT 中调用。 不过,Eric 对辅助程序 DLL 的建议是巨大的矫枉过正,只需使用 GetProcAddress 来获取指向 VC8 版本的指针即可。

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

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