6

Delphi アプリが静的にリンクする MSVC++ でコンパイルされた DLL からstdoutおよびstderr出力をキャプチャしようとしましたが、これまでのところ成功していません。

procedure Test;
var
  fs: TFileStream;

begin
  fs := TFileStream.Create('C:\temp\output.log', fmCreate or fmShareDenyWrite);
  SetStdHandle(STD_OUTPUT_HANDLE, fs.Handle);
  SetStdHandle(STD_ERROR_HANDLE, fs.Handle);

  dllFunc(0); // Writes to stdout in MSVC++ console app, but not here
  // fs.Length is always zero

  fs.Free;
end;

私は正しい軌道に乗っていると思っていましたが、うまくいきません。

  1. SetStdHandle() で十分ですか?
  2. ここで TFileStream を使用するのは適切ですか?
  3. SetStdHandle() に TFileStream を適切に使用していますか?
  4. アプリの読み込み時に DLL が stdout/stderr ハンドルを設定することは可能ですか? もしそうなら、 SetStdHandle() または同等のものを使用するのに最適な場所はどこですか?

どんな助けでも大歓迎です。

4

2 に答える 2

8

DLL がロード時に stdout ハンドルを取得する場合は、コード内の stdout ハンドルを変更した後で DLL を動的にロードする必要があります。

于 2010-04-14T17:30:00.140 に答える
0

アプリがコンソール アプリの場合は、単に実行して、リダイレクトを使用してすべてを stdout にキャプチャできます。すなわち

C:\MyAppWhichCallsDll.exe > c:\temp\output.log
于 2010-04-14T17:26:43.567 に答える