gpt4 book ai didi

delphi - 在Delphi中启动两个进程并用管道连接它们

转载 作者:行者123 更新时间:2023-12-03 14:57:20 27 4
gpt4 key购买 nike

我需要在我的程序中启动两个外部程序,并将第一个程序的 STDOUT 连接到第二个程序的 STDIN。如何在 Delphi 中实现这一目标(RAD Studio 2009,如果重要的话)?我是在Windows环境下操作的。

作为命令行命令,我的情况如下所示:

dumpdata.exe | encrypt.exe "mydata.dat"

最佳答案

似乎有效的快速测试(深受 JCL 的启发):

child1:说“你好,世界!” 3x 标准输出

program child1;

{$APPTYPE CONSOLE}

uses
SysUtils;

procedure Main;
var
I: Integer;
begin
for I := 0 to 2 do
Writeln('Hello, world!');
Write(^Z);
end;

begin
try
Main;
except
on E: Exception do
begin
ExitCode := 1;
Writeln(ErrOutput, Format('[%s] %s', [E.ClassName, E.Message]));
end;
end;
end.

child2:将标准输入上出现的任何内容回显到 OutputDebugString(可以通过 DebugView 查看)

program child2;

{$APPTYPE CONSOLE}

uses
Windows, SysUtils, Classes;

procedure Main;
var
S: string;
begin
while not Eof(Input) do
begin
Readln(S);
if S <> '' then
OutputDebugString(PChar(S));
end;
end;

begin
try
Main;
except
on E: Exception do
begin
ExitCode := 1;
Writeln(ErrOutput, Format('[%s] %s', [E.ClassName, E.Message]));
end;
end;
end.

父级:启动 child1 重定向到 child2

program parent;

{$APPTYPE CONSOLE}

uses
Windows, Classes, SysUtils;

procedure ExecutePiped(const CommandLine1, CommandLine2: string);
var
StartupInfo1, StartupInfo2: TStartupInfo;
ProcessInfo1, ProcessInfo2: TProcessInformation;
SecurityAttr: TSecurityAttributes;
PipeRead, PipeWrite: THandle;
begin
PipeWrite := 0;
PipeRead := 0;
try
SecurityAttr.nLength := SizeOf(SecurityAttr);
SecurityAttr.lpSecurityDescriptor := nil;
SecurityAttr.bInheritHandle := True;
Win32Check(CreatePipe(PipeRead, PipeWrite, @SecurityAttr, 0));

FillChar(StartupInfo1, SizeOf(TStartupInfo), 0);
StartupInfo1.cb := SizeOf(TStartupInfo);
StartupInfo1.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
StartupInfo1.wShowWindow := SW_HIDE;
StartupInfo1.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
StartupInfo1.hStdOutput := PipeWrite;
StartupInfo1.hStdError := GetStdHandle(STD_ERROR_HANDLE);

FillChar(StartupInfo2, SizeOf(TStartupInfo), 0);
StartupInfo2.cb := SizeOf(TStartupInfo);
StartupInfo2.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
StartupInfo2.wShowWindow := SW_HIDE;
StartupInfo2.hStdInput := PipeRead;
StartupInfo2.hStdOutput := GetStdHandle(STD_OUTPUT_HANDLE);
StartupInfo2.hStdError := GetStdHandle(STD_ERROR_HANDLE);

FillChar(ProcessInfo1, SizeOf(TProcessInformation), 0);
FillChar(ProcessInfo2, SizeOf(TProcessInformation), 0);

Win32Check(CreateProcess(nil, PChar(CommandLine2), nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo2,
ProcessInfo2));

Win32Check(CreateProcess(nil, PChar(CommandLine1), nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo1,
ProcessInfo1));

WaitForSingleObject(ProcessInfo2.hProcess, INFINITE);
finally
if PipeRead <> 0 then
CloseHandle(PipeRead);
if PipeWrite <> 0 then
CloseHandle(PipeWrite);
if ProcessInfo2.hThread <> 0 then
CloseHandle(ProcessInfo2.hThread);
if ProcessInfo2.hProcess <> 0 then
CloseHandle(ProcessInfo2.hProcess);
if ProcessInfo1.hThread <> 0 then
CloseHandle(ProcessInfo1.hThread);
if ProcessInfo1.hProcess <> 0 then
CloseHandle(ProcessInfo1.hProcess);
end;
end;

procedure Main;
begin
ExecutePiped('child1.exe', 'child2.exe');
end;

begin
try
Main;
except
on E: Exception do
begin
ExitCode := 1;
Writeln(Error, Format('[%s] %s', [E.ClassName, E.Message]));
end;
end;
end.

关于delphi - 在Delphi中启动两个进程并用管道连接它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2957490/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com