6

我一直在尝试从我的 Delphi 应用程序静态链接到的 MSVC++ 中编译的 DLL 中捕获stdoutstderr输出,但到目前为止还没有成功。

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 在加载时获取标准输出句柄,那么您需要在更改代码中的标准输出句柄后动态加载 DLL。

于 2010-04-14T17:30:00.140 回答
0

如果您的应用程序是控制台应用程序,您可以运行该事物并通过重定向将所有内容捕获到标准输出。IE

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