0

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

谢谢。

4

2 回答 2

0

也试试freopen……但这也可能需要在旧的 CRT 中调用。Eric 对帮助 DLL 的建议虽然是大材小用,但只是GetProcAddress用来获取指向 VC8 版本的指针。

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

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

于 2011-05-10T21:53:14.307 回答
0

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

于 2011-05-10T21:43:29.990 回答