Мое намерение состояло в создании анонимных труб и ручек ввода и вывода, которые передаются в качестве параметров команды дочернему процессу, с возможностью наследования. Вот выдержка из кода 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;
процесс Ребенок начал с заголовком, который показывает правильные ручки, но когда я ударил кнопку (я din't инициируют послал из родителей), ReadFile завершается с ошибкой code- недопустимого дескриптора (6). Я думал, что ребенок наследует ручки для родительских труб, поэтому я могу использовать его свободно, но у меня явно что-то не так.
Любой помощь
В тот же момент, когда я заметил, что все дело в SECURITY_ATTRIBUTES. Спасибо. – Djole