2016-08-12 8 views
0

Мое намерение состояло в создании анонимных труб и ручек ввода и вывода, которые передаются в качестве параметров команды дочернему процессу, с возможностью наследования. Вот выдержка из кода 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). Я думал, что ребенок наследует ручки для родительских труб, поэтому я могу использовать его свободно, но у меня явно что-то не так.

Любой помощь

ответ

1

только ручки, которые наследуемые наследуются.

Вы можете сделать накладные накладки наносимыми либо передав структуру CreateCipe(), либо указав SetHandleInformation(), чтобы установить флаг HANDLE_FLAG_INHERIT.

+0

В тот же момент, когда я заметил, что все дело в SECURITY_ATTRIBUTES. Спасибо. – Djole

Смежные вопросы