我有一个用 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() 但我无法获得该函数的有效地址。任何帮助将不胜感激。
谢谢。