printfまたはcoutを使用してコンソール出力を介して多くの有用な情報を報告するC++ dllがあります。この dll を MFC で記述された GUI アプリケーションにリンクしており、その出力にアクセスしたいと考えています。
かなり単純ですね。何時間もインターネットを検索し、いくつかの解決策を実装した後、どれもうまくいかなかったとき、私は驚きました!
そのため、アプリケーションに関する追加情報が必要になる場合があります。アクセスできない巨大なホスト アプリケーションがあります。実際、私はそれにプラグインを書いています。実行時にプラグイン dll をリンクします (LoadLibrary() を使用すると思います)。私のdllは、今度は、取得したい出力の外部dllを使用します。この dll は、対応する lib ファイルを介して静的にリンクされているため、CRT がすべての読み込みを行います。
私の知る限り、すべてのアプリケーション (どのような方法でロードされた dll も含む) には、単一の stdout ストリーム (単一の stdin と単一の stderr) があります。そして、それは私にとって物事が複雑になりすぎるときです. この stdout ストリームを (明らかに、アプリケーション/プロセス全体に対して) リダイレクトしようとしましたが、場合によっては MY dll では機能しましたが、EXTERNAL dll ではまだ機能しません。つまり、dll のようなものを使用するとcout << "Hey!";
、ストリームをリダイレクトしたファイルでこれを確認できます。ただし、外部 dll 内からの同じ呼び出し (はい、ソースはありますが、実際には変更したくありません) は何もしません。神は、この出力がどこで行われるかを知っています。
私はもう試した:
- 古き良き
freopen()
トリック。私のDLLでは機能しましたが、外部DLLには影響しません。 - WinAPI
SetStdHandle()
呼び出し。まったく機能しません。Win7 で問題が発生しているようです。 AllocConsole()
+_open_osfhandle()
. 1 と同じです。コンソールに出力が表示されますが、外部 dll の出力は表示されません。cout.rdbuf()
再割り当てします。3 と同じですが、cout のみです。
ええと、皆さん、私は本当に助けが必要です。私は立ち往生しているようです:-/
追加情報:
ホスト アプリケーション、私の dll、および外部 dll は、MSVS'05 を使用して開発されました。すべての dll には、「スタティック ライブラリで MFC を使用する」設定があります。テストは Win7 x64 で行われました。私はすべてのソースを持っていますが、それらを変更する権限はありません。