我的目的是创建一个输入和输出的匿名管道和句柄,作为命令参数传递给子进程,具有可继承的选项。这里摘自Pascal(Lazarus)代码(没有启动管道写入的按钮......)。
procedure TForm2.Button1Click(Sender: TObject);
var pi: tprocessinformation;
si: tstartupinfo;
h1, h2: thandle;
begin
createpipe(h1, h2, nil, 300); // --getlasterror returns 0
caption:= inttostr(h1)+ ' '+ inttostr(h2); // just to check
si.cb:= sizeof(si);
zeromemory(@si, sizeof(si));
createprocess(nil, pchar('ChildProject.exe '+ caption), nil, nil, true, 0, nil, nil, si, pi);
end;
子进程代码(我故意没有使用单独的线程,只是为了开始)。
procedure TForm3.Button2Click(Sender: TObject);
var d: dword;
hin, hout: thandle;
begin
if paramcount= 2 then
begin
hout:= strtoint(paramstr(1));
hin:= strtoint(paramstr(2));
caption:= inttostr(hout)+ ' '+ inttostr(hin);
end;
readfile(hin, a, 8, d, nil);
label1.caption:= inttostr(d)+ ' '+ inttostr(getlasterror);
end;
子进程以带有显示正确句柄的标题开始,但是当我按下按钮时(我发起从父进程发送),readfile退出时出现错误代码 - 无效句柄(6)。 我以为那个孩子继承了父母的管道把手,所以我可以自由地使用它,但我显然有些不对劲。
任何帮助
答案 0 :(得分:1)
仅继承可继承的句柄。
您可以通过将SECURITY_ATTRIBUTES
结构传递给CreatePipe()或通过调用SetHandleInformation()来设置HANDLE_FLAG_INHERIT
标志来使管道句柄可继承。