0

私は VS2008 でビルドされた Win32 プログラムを持っているので、私のコードは MSVCR90.DLL と MSVCP90.DLL にリンクされています。ただし、VS2005 でビルドされた DLL (私は変更できません) でコードを実行しており、その DLL のコードが clog ストリームに出力されると、MSVCR80.DLL および MSVCP80.DLL を介して実行されます。問題は次のとおりです。コードで std::clog を再ルーティングすると、crt 9.0 ライブラリに対してビルドされたコードにのみ影響し、古い crt 8.0 を使用するコードでは出力が再ルーティングされません。古い CRT に対してビルドされた DLL で clog ストリームを再ルーティングする方法はありますか?

古い CRT DLL での GetModuleHandle() と GetProcAddress() の呼び出しを調査し、(_open_osfhandle と _dup2 を介して) C stderr ストリームを再ルーティングすることに成功しましたが、C++ の詰まりストリームはまだ影響を受けていないようです。古い CRT ライブラリで ios_base::sync_with_stdio() も呼び出す必要があると思いますが、その関数への有効なアドレスを取得できませんでした。どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

0

VS2005 を使用してヘルパー DLL を作成する - この DLL は、VS8 ランタイムに必要なセットアップを行うためにいくつかの関数をエクスポートするだけです。

于 2011-05-10T21:43:29.990 に答える
0

も試してみてくださいfreopen...しかし、これも古いCRTで呼び出す必要があるかもしれません。Eric のヘルパー DLL の提案はGetProcAddress大げさですが、VC8 バージョンへのポインターを取得するために使用するだけです。

最も効果的なオプションは、最初にプロセスを起動するときに標準ストリームをリダイレクトすることです。

もう 1 つの可能性は、ヘルパー DLL を遅延ロードし、ロードする前にストリームのリダイレクトを実行することです。そうすれば、MSVCRT80 が読み込まれると、リダイレクトされたストリームにアタッチされます。

于 2011-05-10T21:53:14.307 に答える