Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.07.26;
Скачать: CL | DM;

Вниз

Дождаться завершения выполнения процесса   Найти похожие ветки 

 
harisma   (2008-06-09 16:09) [0]

Здравствуйте. В программе по кнопке создается некий внешний процесс используя API функцию CreateProcess. Все работало нормально, но возникла необходимость теперь запустив процесс на выполнение, ДОЖДАТЬСЯ ЕГО ЗАВЕРШЕНИЯ, переведя программу в ждущий режим. Каким образом программа может узнать, что запущенный внешний процесс завершился?
Спасибо.


 
Поросенок Винни-Пух ©   (2008-06-09 16:11) [1]

вэйтфорсинглеобжект энд компания


 
harisma   (2008-06-09 16:36) [2]

Thanks


 
Тын-Дын ©   (2008-06-09 21:21) [3]


> harisma   (09.06.08 16:36) [2]


Если с нерусского из [1] перевести на нормальный, то получим пример:

function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
 pi:PROCESS_INFORMATION;
 si:STARTUPINFO;
 cmdLine,Path: String;
begin
 ZeroMemory(@si,sizeof(si));
 si.cb:=SizeOf(si);
 si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
 if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
 Path := ExtractFilePath(aCommand);
 cmdLine := aCommand;
 Result :=
        CreateProcess( nil,
                       PChar(cmdLine),
                       nil,
                       nil,
                       False,
                       0,
                       nil,
                       PChar(Path),
                       si,
                       pi );
 if Result then
 begin
   CloseHandle(Info^.pi.hThread);
   if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
   CloseHandle(Info^.pi.hProcess);
 end;
end;


 
Германн ©   (2008-06-10 01:47) [4]


> Тын-Дын ©   (09.06.08 21:21) [3]

Не ты ли жалился про трудности в поиске по местному ФАКу?
http://delphimaster.ru/cgi-bin/search.pl?words=CreateProcess&n=101
Вторая ссылка содержит твой ответ.
Кстати более грамотный.чем твой. Чуть-чуть более, но всё-таки более!


 
Тын-Дын ©   (2008-06-10 10:35) [5]

я бы сказал - по ссылке немного менее грамотный ответ. Да еще и с неочевидной ошибкой.


 
Поросенок Винни-Пух ©   (2008-06-10 11:03) [6]

Да еще и с неочевидной ошибкой.

А жирное в твоем коде это что?

CloseHandle(Info^.pi.hThread);


 
Игорь Шевченко ©   (2008-06-10 11:11) [7]

Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает?

А я так делаю:

function RunAndWait (const ExeName, ParamString: string;
 QuoteParams: Boolean = true): Integer;
var
 ShellInfo: TShellExecuteInfo;
 ExitCode: DWORD;
begin
 ShellInfo.cbSize := SizeOf(ShellInfo);
 ShellInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
 ShellInfo.Wnd := HWND_DESKTOP;
 ShellInfo.lpVerb := "open";
 ShellInfo.lpFile := PChar(ExeName);
 if QuoteParams then
   ShellInfo.lpParameters := PChar("""+ParamString+""")
 else
   ShellInfo.lpParameters := PChar(ParamString);
 ShellInfo.lpDirectory := PChar(ExtractFilePath(ExeName));
 ShellInfo.nShow := SW_HIDE;
 if not ShellExecuteEx(@ShellInfo) then
   RaiseLastOSError;
 if ShellInfo.hProcess <> 0 then
   try
     WaitForSingleObjectEx(ShellInfo.hProcess, INFINITE, false);
     GetExitCodeProcess(ShellInfo.hProcess, ExitCode);
     Result := ExitCode;
   finally
     CloseHandle(ShellInfo.hProcess);
   end
 else
   Result := -1;
end;


 
Тын-Дын ©   (2008-06-10 14:20) [8]


> А жирное в твоем коде это что?
>
> CloseHandle(Info^.pi.hThread);

Опечатка. От прежнего проекта осталась.



Страницы: 1 вся ветка

Текущий архив: 2009.07.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
11-1203768494
andreil
2008-02-23 15:08
2009.07.26
Как изменить дату файла?


4-1213170511
Игорь Х
2008-06-11 11:48
2009.07.26
Как получить информацию о памяти запущенного процесса?


2-1243432407
Darvin
2009-05-27 17:53
2009.07.26
Странное поведение FindDialog


2-1243504299
Pavlov
2009-05-28 13:51
2009.07.26
Путь к файлу


15-1243262312
@!!ex
2009-05-25 18:38
2009.07.26
Как добавить информацию о версии в С++?