Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / После выполнения CreateProcess зависаем на WaitForSingleObject / 25 сообщений из 45, страница 1 из 2
16.11.2020, 17:32
    #40019001
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
Всем привет!
Подскажите, пожалуйста:

Необходимо выполнять консольное приложение и получить его вывод.

Нашел такой код:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
function Run_Dos(CmdLine: string) : string;
const
  ReadBuffer = 255;
var
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: array [0 .. 255] of AnsiChar;
  BytesRead: DWord;
  Apprunning: DWord;
begin
 
  with Security do
  begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
  if Createpipe(ReadPipe, WritePipe,
    @Security, 0) then
  begin
    result := '';
 
    FillChar(Start, Sizeof(Start), #0);
    start.cb := SizeOf(start);
    start.hStdOutput := WritePipe;
    start.hStdInput := ReadPipe;
 
    start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
 
    start.wShowWindow := SW_HIDE;
 
 
    if CreateProcess(nil,
      PChar(CmdLine),
      @Security,
      @Security,
      true,
      NORMAL_PRIORITY_CLASS,
      nil,
      nil,
      start,
      ProcessInfo) then
    begin
 
//     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 10000);
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, infinite);
 
 
    //перед чтением из пайпа закрыть один конец
     CloseHandle(WritePipe);
 
      repeat
        ReadFile(ReadPipe, Buffer, ReadBuffer, BytesRead, nil);
        Buffer[BytesRead] := #0;
        result := result + Buffer;
 
 
      until (BytesRead < ReadBuffer);
    end;
 
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
  end;
 
end;



Но, к сожалению, он не со всеми приложениями работает корректно. Выполнение некоторых консольных приложений привод к зависанию вот в этом месте:

Код: pascal
1.
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, infinite);



(в диспетчере задач видим незавершенный процесс запущенного консольного приложения)

Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается).

Что в коде не так?
...
Рейтинг: 0 / 0
16.11.2020, 17:49
    #40019008
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segor
Выполнение некоторых консольных приложений привод к зависанию вот в этом месте

Перенеси эту строчку после цикла чтения из пайпа.
...
Рейтинг: 0 / 0
16.11.2020, 17:57
    #40019016
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segorЧто в коде не так?

В коде много чего неправильно. Изучай оригинал:
https://docs.microsoft.com/en-us/windows/win32/ProcThread/creating-a-child-process-with-redirected-input-and-output
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.11.2020, 17:58
    #40019018
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
Kazantsev Alexey
segor
Выполнение некоторых консольных приложений привод к зависанию вот в этом месте

Перенеси эту строчку после цикла чтения из пайпа.


Перенес. Все равно на ней виснет.
...
Рейтинг: 0 / 0
16.11.2020, 18:20
    #40019027
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
Kazantsev Alexey
Перенеси эту строчку после цикла чтения из пайпа.
Зачем? Сейчас все логично: ждем пока процесс не завершится, а потом выгребаем все из пайпа. А так, если дочерний процесс задумается перед выводом, то мы проскочим цикл и будем в тупую ждать завершения
...
Рейтинг: 0 / 0
16.11.2020, 18:29
    #40019036
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segor
Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается).
Значит в чем-то отличие. Например в параметрах командной строки.

Сделайте
Код: pascal
1.
start.wShowWindow := SW_SHOW;

и посмотрите, что ждет приложение

Далее, поверьте, вот это
segor
Код: pascal
1.
start.hStdInput := ReadPipe;

вам не нужно
А вот эти две строки
segor
Код: pascal
1.
2.
3.
4.
//     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 10000);
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, infinite);
    //перед чтением из пайпа закрыть один конец
     CloseHandle(WritePipe);

логично будет поменять местами
...
Рейтинг: 0 / 0
16.11.2020, 18:39
    #40019046
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
_Vasilisk_Сейчас все логично: ждем пока процесс не завершится, а потом выгребаем все из пайпа.

Ага, но перед этим сделали с вызываемым процессом грязный трюк, описанный в одном
бородатом анекдоте фразой "а теперь циркулируй".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.11.2020, 18:43
    #40019048
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segor
Перенес. Все равно на ней виснет.

У тебя ещё условие цикла некорректное. Чтение может вернуть меньше, чем ты просишь, но это не повод прерывать цикл.

_Vasilisk_
Сейчас все логично: ждем пока процесс не завершится, а потом выгребаем все из пайпа.

А буфер пайпа у тебя бесконечный?
...
Рейтинг: 0 / 0
16.11.2020, 18:50
    #40019053
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
_Vasilisk_
segor
Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается).
Значит в чем-то отличие. Например в параметрах командной строки.

Сделайте
Код: pascal
1.
start.wShowWindow := SW_SHOW;

и посмотрите, что ждет приложение

Далее, поверьте, вот это
segor
Код: pascal
1.
start.hStdInput := ReadPipe;

вам не нужно
А вот эти две строки
segor
Код: pascal
1.
2.
3.
4.
//     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 10000);
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, infinite);
    //перед чтением из пайпа закрыть один конец
     CloseHandle(WritePipe);

логично будет поменять местами


Сделал.
Появляется консольное окно. В нем мигает курсор. Вывода нет.
Тут все так же виснем WaitForSingleObject
...
Рейтинг: 0 / 0
16.11.2020, 18:52
    #40019055
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
ExecuteProcess
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
//
Function ExecuteProcess(Const AExecutable, ACommandLine, ACurrentDir : String; AOnOutputDataProc : TOnOutputDataProc; ATimeoutInterval : DWORD; ATimeoutExitCode : DWORD) : LongWord;
Var

 RPipe  : THandle;
 WPipe  : THandle;
 SA     : TSecurityAttributes;
 SI     : TStartupInfo;
 PA     : TProcessInformation;
 Buffer : Array [0 .. 128 - 1] Of Byte;
 Count  : Cardinal;

Begin

 Result := 0;

 //
 ZeroMem(@SA, SizeOf(SA));

 SA.nLength              := SizeOf(SA);
 SA.lpSecurityDescriptor := NIL;
 SA.bInheritHandle       := True;
 //

 If Not Assigned(AOnOutputDataProc) Then
  Begin

   RPipe := INVALID_HANDLE_VALUE;
   WPipe := INVALID_HANDLE_VALUE;

  End
 Else
  If Not CreatePipe(RPipe, WPipe, @SA, 0) Then
   RaiseLastOSError;

 Try

  //
  ZeroMem(@SI, SizeOf(SI));

  SI.cb          := SizeOf(SI);
  SI.hStdOutput  := WPipe;
  SI.hStdError   := WPipe;
  SI.dwFlags     := STARTF_USESTDHANDLES Or STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_HIDE;
  //

  //
  ZeroMem(@PA, SizeOf(PA));
  //

  If CreateProcess(PChar(AExecutable), PChar(ACommandLine), NIL, NIL, True, 0, NIL, PChar(Pointer(ACurrentDir)), SI, PA) Then
   Try

    If WPipe <> INVALID_HANDLE_VALUE Then
     Begin

      CloseHandle(WPipe);

      WPipe := INVALID_HANDLE_VALUE;

     End;

    If ATimeoutInterval <> INFINITE Then
     TWatchdogThread.Create(PA.hProcess, ATimeoutInterval, ATimeoutExitCode);

    If Assigned(AOnOutputDataProc) Then
     While ReadFile(RPipe, Buffer, SizeOf(Buffer), Count, NIL) And (Count > 0) Do
      AOnOutputDataProc(Buffer, Count);

   Finally

    WaitForSingleObject(PA.hProcess, INFINITE);

    If Not GetExitCodeProcess(PA.hProcess, Result) Then
     RaiseLastOSError;

    CloseHandle(PA.hThread);
    CloseHandle(PA.hProcess);

   End
  Else
   RaiseLastOSError;

 Finally

  If RPipe <> INVALID_HANDLE_VALUE Then
   CloseHandle(RPipe);

  If WPipe <> INVALID_HANDLE_VALUE Then
   CloseHandle(WPipe);

 End;

End;
//

...
Рейтинг: 0 / 0
16.11.2020, 18:52
    #40019056
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segor
Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается).
Точно завершается? Не пишет "Press any key"?
...
Рейтинг: 0 / 0
16.11.2020, 18:53
    #40019057
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
Dimitry Sibiryakov

segorЧто в коде не так?

В коде много чего неправильно. Изучай оригинал:
https://docs.microsoft.com/en-us/windows/win32/ProcThread/creating-a-child-process-with-redirected-input-and-output


Ок, спасибо, будем изучать.
...
Рейтинг: 0 / 0
16.11.2020, 18:54
    #40019058
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
bk0010
segor
Если это же консольное приложение выполнять из командной строки - то все выполняется корректно (выводит результаты в консоль и завершается).
Точно завершается? Не пишет "Press any key"?


Да точно. В диспетчере задач появляется после запуска и пропадает после завершения работы.
...
Рейтинг: 0 / 0
16.11.2020, 19:11
    #40019079
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segor
Появляется консольное окно. В нем мигает курсор. Вывода нет.
Логично, вы же весь вывод затягиваете к себе в программу.

Делайте так
segor
Код: pascal
1.
start.dwFlags := STARTF_USESHOWWINDOW;

и смотрите, чего не хватает процессу. А потом вернете флаг обратно
...
Рейтинг: 0 / 0
16.11.2020, 19:15
    #40019084
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
_Vasilisk_Логично, вы же весь вывод затягиваете к себе в программу.

Нет. Присмотрись повнимательнее куда он засунул второй конец трубы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.11.2020, 19:24
    #40019092
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
Dimitry Sibiryakov
Присмотрись повнимательнее куда он засунул второй конец трубы.
Это я уже говорил
_Vasilisk_
Далее, поверьте, вот это
segor
Код: pascal
1.
start.hStdInput := ReadPipe;

вам не нужно
Товарищ обещал исправить.

Ну и если программа не ожидает ввода, то это ни на что влиять не должно. А если ожидает, то код должен быть совершенно другим
...
Рейтинг: 0 / 0
16.11.2020, 19:25
    #40019093
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
_Vasilisk_
segor
Появляется консольное окно. В нем мигает курсор. Вывода нет.
Логично, вы же весь вывод затягиваете к себе в программу.

Делайте так
segor
Код: pascal
1.
start.dwFlags := STARTF_USESHOWWINDOW;

и смотрите, чего не хватает процессу. А потом вернете флаг обратно


Сделал.
Теперь вижу в консольном окне вывод приложения так, как было бы если запускал его из командой строки.


function Run_Dosfunction Run_Dos(CmdLine: string) : string;
const
ReadBuffer = 255;
var
Security: TSecurityAttributes;
ReadPipe, WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer: array [0 .. 255] of Char;
BytesRead: DWord;
Apprunning: DWord;
begin

with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe(ReadPipe, WritePipe,
@Security, 0) then
begin
result := '';

FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
// start.hStdInput := ReadPipe;

// start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.dwFlags := STARTF_USESHOWWINDOW;

// start.wShowWindow := SW_HIDE;
start.wShowWindow := SW_SHOW;


if CreateProcess(nil,
PChar(CmdLine),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo) then
begin


//перед чтением из пайпа закрыть один конец
CloseHandle(WritePipe);

Apprunning := WaitForSingleObject(ProcessInfo.hProcess, infinite);




repeat
ReadFile(ReadPipe, Buffer, ReadBuffer, BytesRead, nil);
Buffer[BytesRead] := #0;
result := result + Buffer;


until (BytesRead < ReadBuffer);
end;


CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);



end;

end;

...
Рейтинг: 0 / 0
16.11.2020, 19:27
    #40019094
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segor
Теперь вижу в консольном окне вывод приложения так, как было бы если запускал его из командой строки.
И приложение само завершается? Или ждет ввода от пользователя и только потом завершается?
...
Рейтинг: 0 / 0
16.11.2020, 19:28
    #40019095
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
_Vasilisk_
segor
Теперь вижу в консольном окне вывод приложения так, как было бы если запускал его из командой строки.
И приложение само завершается? Или ждет ввода от пользователя и только потом завершается?


Само.
...
Рейтинг: 0 / 0
17.11.2020, 15:19
    #40019494
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segor
Само.
Я правильно понял, что если поставить
Код: pascal
1.
start.dwFlags := STARTF_USESHOWWINDOW;

то запущенное приложение завершается само и ваша программа не зависает? При этом в запущенном приложении вы не нажимаете никаких клавиш?
...
Рейтинг: 0 / 0
18.11.2020, 10:46
    #40019836
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
_Vasilisk_
segor
Само.
Я правильно понял, что если поставить
Код: pascal
1.
start.dwFlags := STARTF_USESHOWWINDOW;

то запущенное приложение завершается само и ваша программа не зависает? При этом в запущенном приложении вы не нажимаете никаких клавиш?


Да, так и есть.
...
Рейтинг: 0 / 0
18.11.2020, 11:16
    #40019848
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segor,

попробуйте этот код

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
//Based on RunDosInMemo() from
//   https://stackoverflow.com/questions/9119999

procedure ExecAppAndGetOutput(const ACmdStr: string; AOutput: TStrings;
  AAsync: boolean = false);
const
   READ_BUFFER_SIZE = 2400;
var
   sCmdStr  : string;
   Security: TSecurityAttributes;
   readableEndOfPipe, writeableEndOfPipe: THandle;
   start: TStartUpInfo;
   ProcessInfo: TProcessInformation;
   Buffer: PAnsiChar;
   BytesRead: DWORD;
   AppRunning: DWORD;
begin
   sCmdStr := ACmdStr;

   Security.nLength := SizeOf(TSecurityAttributes);
   Security.bInheritHandle := True;
   Security.lpSecurityDescriptor := nil;

   if CreatePipe({var}readableEndOfPipe, {var}writeableEndOfPipe, @Security, 0) then
   begin
      Buffer := AllocMem(READ_BUFFER_SIZE+1);
      try
         FillChar(Start, Sizeof(Start), #0);
         start.cb := SizeOf(start);

         // Set up members of the STARTUPINFO structure.
         // This structure specifies the STDIN and STDOUT handles for redirection.
         // - Redirect the output and error to the writeable end of our pipe.
         // - We must still supply a valid StdInput handle (because we used STARTF_USESTDHANDLES to swear that all three handles will be valid)
         start.dwFlags := start.dwFlags or STARTF_USESTDHANDLES;
         start.hStdInput := GetStdHandle(STD_INPUT_HANDLE); //we're not redirecting stdInput; but we still have to give it a valid handle
         start.hStdOutput := writeableEndOfPipe; //we give the writeable end of the pipe to the child process; we read from the readable end
         start.hStdError := writeableEndOfPipe;

         //We can also choose to say that the wShowWindow member contains a value.
         //In our case we want to force the console window to be hidden.
         start.dwFlags := start.dwFlags + STARTF_USESHOWWINDOW;
         start.wShowWindow := SW_HIDE;

         // Don't forget to set up members of the PROCESS_INFORMATION structure.
         //--- ProcessInfo := Default(TProcessInformation);
         FillChar(ProcessInfo, SizeOf(ProcessInfo), 0);


         //WARNING: The unicode version of CreateProcess (CreateProcessW) can modify the command-line "DosApp" string.
         //Therefore "DosApp" cannot be a pointer to read-only memory, or an ACCESS_VIOLATION will occur.
         //We can ensure it's not read-only with the RTL function: UniqueString
         UniqueString({var}sCmdStr);

         try
            if CreateProcess(nil, PChar(sCmdStr), nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, start, {var}ProcessInfo) then
            begin
               //Wait for the application to terminate, as it writes it's output to the pipe.
               //WARNING: If the console app outputs more than 2400 bytes (ReadBuffer),
               //it will block on writing to the pipe and *never* close.
               repeat
                  Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
                  if AAsync then Application.ProcessMessages();
               until (Apprunning <> WAIT_TIMEOUT);

               //Read the contents of the pipe out of the readable end
               //WARNING: if the console app never writes anything to the StdOutput, then ReadFile will block and never return
               repeat
                  BytesRead := 0;
                  ReadFile(readableEndOfPipe, Buffer[0], READ_BUFFER_SIZE, {var}BytesRead, nil);
                  Buffer[BytesRead]:= #0;
                  OemToAnsi(Buffer,Buffer);
                  AOutput.Text := AOutput.Text + String(Buffer);
               until (BytesRead < READ_BUFFER_SIZE);
            end;
         finally
            CloseHandle(ProcessInfo.hProcess);
            CloseHandle(ProcessInfo.hThread);
            CloseHandle(readableEndOfPipe);
            CloseHandle(writeableEndOfPipe);
         end;
      finally
         FreeMem(Buffer);
      end;
   end; //if CreatePipe
end;
...
Рейтинг: 0 / 0
18.11.2020, 13:04
    #40019900
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
Код: pascal
1.
2.
3.
4.
5.
    start.hStdOutput := WritePipe;
    start.hStdInput := INVALID_HANDLE_VALUE;
 
    start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
 
...
Рейтинг: 0 / 0
19.11.2020, 10:33
    #40020252
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
Кроик Семён
segor,

попробуйте этот код



Попробовал.
Зависает тут:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
      repeat
        ReadFile(ReadPipe, Buffer, ReadBuffer, BytesRead, nil);
        Buffer[BytesRead] := #0;
        result := result + Buffer;
 
 
      until (BytesRead < ReadBuffer);
...
Рейтинг: 0 / 0
19.11.2020, 10:57
    #40020266
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
После выполнения CreateProcess зависаем на WaitForSingleObject
segor
Кроик Семён
segor,

попробуйте этот код



Попробовал.
Зависает тут:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
      repeat
        ReadFile(ReadPipe, Buffer, ReadBuffer, BytesRead, nil);
        Buffer[BytesRead] := #0;
        result := result + Buffer;
 
 
      until (BytesRead < ReadBuffer);


Жесть... А если прочитается ровно столько сколько в буфере максимум? Что будет с последним байтом?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / После выполнения CreateProcess зависаем на WaitForSingleObject / 25 сообщений из 45, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]