2011-05-10 14 views
0

我有一個用VS2008構建的Win32程序,所以我的代碼與MSVCR90.DLL和MSVCP90.DLL鏈接。但是,它也在DLL中運行代碼(我無法修改),這是使用VS2005構建的,當DLL中的代碼打印到堵塞流時,它通過MSVCR80.DLL和MSVCP80.DLL執行。這裏的問題是:如果我在代碼中重新路由std :: clog,我只影響針對crt 9.0 libs構建的代碼,使用舊版crt 8.0的代碼將不會使其輸出重新路由。那麼是否有一種方法可以在針對較舊的CRT構建的DLL中重新路由clog流?如何在另一個CRT庫中重新路由std :: clog?

我調查了舊CRT CRT DLL上調用GetModuleHandle()和GetProcAddress()並設法重新路由C stderr流(通過_open_osfhandle和_dup2),但是C++阻塞流似乎仍然不受影響。我想我還需要在較舊的CRT庫中調用ios_base :: sync_with_stdio(),但我無法獲得該函數的有效地址。任何幫助將不勝感激。

謝謝。

回答

0

使用VS2005構建一個助手DLL - 該DLL應該簡單地導出一些函數來完成VS8運行時所需的設置。

+0

謝謝,但要去延遲加載的DLL方法。 – quzox 2011-05-12 18:57:38

0

也嘗試freopen ......但是這也可能需要在較舊的CRT中調用。埃裏克的幫助DLL的建議是巨大的矯枉過正,只是使用GetProcAddress獲得指向VC8版本的指針。

最有效的選擇是首先啓動流程時重定向標準流。

另一種可能性是延遲加載助手DLL,並在加載之前執行流重定向。這樣,當MSVCRT80加載時,它將附加到重定向的流。

+0

謝謝,正如我已經提到的,我已經嘗試過GetProcAddress方法,對於標準C流(例如stderr)取得了一些成功,但卻無法讓它適用於C++流(例如阻塞或cerr)。我想我也需要在較舊的CRT中調用ios_base :: sync_with_stdio(),但是,得到一個指向C++名稱的mangled函數的指針是不可能的(或者我只是做錯了!)。我想我會嘗試延遲加載的DLL方法。看起來像很多工作的開始聽起來微不足道的事情! – quzox 2011-05-12 19:02:07

相關問題