4

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 内からの同じ呼び出し (はい、ソースはありますが、実際には変更したくありません) は何もしません。神は、この出力がどこで行われるかを知っています。

私はもう試した:

  1. 古き良きfreopen()トリック。私のDLLでは機能しましたが、外部DLLには影響しません。
  2. WinAPISetStdHandle()呼び出し。まったく機能しません。Win7 で問題が発生しているようです。
  3. AllocConsole()+ _open_osfhandle(). 1 と同じです。コンソールに出力が表示されますが、外部 dll の出力は表示されません。
  4. cout.rdbuf()再割り当てします。3 と同じですが、cout のみです。

ええと、皆さん、私は本当に助けが必要です。私は立ち往生しているようです:-/

追加情報:
ホスト アプリケーション、私の dll、および外部 dll は、MSVS'05 を使用して開発されました。すべての dll には、「スタティック ライブラリで MFC を使用する」設定があります。テストは Win7 x64 で行われました。私はすべてのソースを持っていますが、それらを変更する権限はありません。

4

2 に答える 2

1

「静的ライブラリでMFCを使用する」設定によってIIRCが台無しになっています。int (POSIX スタイル) ハンドルの設定/再オープンは機能しません。これは、DLL とアプリケーションの両方が異なるネット/個別のランタイム ライブラリを使用しているためです。解決策: [共有 DLL で MFC を使用する]設定を使用します。Windows での静的ランタイム ライブラリの使用は、まさにこの種の問題のために遅れています。

于 2010-12-09T12:26:31.297 に答える
0

_dup2を試しましたか?MSDNドキュメントの例は、リダイレクトする方法を示していますstdout。(これがライブラリレベルで機能するのか、WindowsのOSレベルで機能するのかわからないため、プロセス全体で機能しない可能性があります。)

もちろん、DLLも書き込みを行っている可能性がありstderrます。

于 2010-12-09T12:15:53.540 に答える