Delphi 如何将DLL中的标准输出重定向到TMemo

Delphi 如何将DLL中的标准输出重定向到TMemo,delphi,Delphi,我有一个无法更改的第三方dll,并以不规则的间隔将其输出发送到stdout。我想捕获stdout并在TMemo控件中显示它。前面的答案()显示了如何将此类输出捕获到文件中,我想将其捕获到TMemo中 可能的解决方案:我可以在文件充满stdout的输出时读取该文件并轮询该文件,但我需要从以前保存的输出中识别新的输出。此外,这似乎不是一个真正的解决方案。我做了很多互联网搜索,我发现最常见的相关答案是如何从外部应用程序捕获标准输出,这不是我想做的,我想从dll捕获输出。还有这个代码片段,但我并不真正理

我有一个无法更改的第三方dll,并以不规则的间隔将其输出发送到stdout。我想捕获stdout并在TMemo控件中显示它。前面的答案()显示了如何将此类输出捕获到文件中,我想将其捕获到TMemo中

可能的解决方案:我可以在文件充满stdout的输出时读取该文件并轮询该文件,但我需要从以前保存的输出中识别新的输出。此外,这似乎不是一个真正的解决方案。我做了很多互联网搜索,我发现最常见的相关答案是如何从外部应用程序捕获标准输出,这不是我想做的,我想从dll捕获输出。还有这个代码片段,但我并不真正理解它在做什么或如何使用它——但它似乎解决了同样的问题。有人在他们的网络旅行中发现了与这个话题相关的东西吗


我有一些基于管道的工作,并没有我想象的那么困难,但仍然有一件事困扰着我。代码如下:

var
  TextBuffer: array[1..32767] of AnsiChar;
  TextString: AnsiString;
  BytesRead, BytesRem: cardinal;
  PipeSize: cardinal;
  Security : TSecurityAttributes;
begin
 Security.nlength := SizeOf(TSecurityAttributes) ;
 Security.binherithandle := true;
 Security.lpsecuritydescriptor := nil;
 if CreatePipe(outputPipeRead, outputPipeWrite, @Security, 0) then
    begin
    SetStdHandle(STD_OUTPUT_HANDLE, outputPipeWrite);
    end
 else
    showmessage ('Error in creating pipe');

 .... Call dll here so that it sends output to stdout

 PipeSize := Sizeof (textbuffer);
 PeekNamedPipe (outputPipeRead, nil, PipeSize, @BytesRead, @PipeSize, @BytesRem);
 if BytesRead > 0 then
    begin
    if ReadFile(outputPipeRead, TextBuffer, PipeSize, BytesRead, nil) then
       begin
       // a requirement for Windows OS system components
       OemToChar(@TextBuffer, @TextBuffer);
       TextString := AnsiString(TextBuffer);
       SetLength(TextString, BytesRead);
       mOutput.Lines.Add (TextString);
       end;
    end
else
    showmessage ('No text');

这确实捕获了输出并将其存放在TMemo中,但我不明白的是,为什么(经过多次尝试和错误之后),SetstHandle将outputPipeWrite分配给stdout,但通过outputPipeRead读取管道?这段代码的灵感来自

,正如我在评论中解释的,解决这一问题的方法是创建一个管道。通过调用
SetStdHandle
将管道的写入端连接到标准输出。从管道的读取端读取,并将内容放入备忘录中

创建一个管道。调用SetStdHandle重定向到管道。我有一些基于管道的工作,并没有我想象的那么困难。代码如下:管道就是这样工作的。一方写入管道的一端,另一方从另一端读取。