管道通信和命令参数

时间:2016-08-12 21:42:30

标签: windows communication

我的目的是创建一个输入和输出的匿名管道和句柄,作为命令参数传递给子进程,具有可继承的选项。这里摘自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)。 我以为那个孩子继承了父母的管道把手,所以我可以自由地使用它,但我显然有些不对劲。

任何帮助

1 个答案:

答案 0 :(得分:1)

仅继承可继承的句柄。

您可以通过将SECURITY_ATTRIBUTES结构传递给CreatePipe()或通过调用SetHandleInformation()来设置HANDLE_FLAG_INHERIT标志来使管道句柄可继承。