-
Здравствуйте. В программе по кнопке создается некий внешний процесс используя API функцию CreateProcess. Все работало нормально, но возникла необходимость теперь запустив процесс на выполнение, ДОЖДАТЬСЯ ЕГО ЗАВЕРШЕНИЯ, переведя программу в ждущий режим. Каким образом программа может узнать, что запущенный внешний процесс завершился? Спасибо.
-
вэйтфорсинглеобжект энд компания
-
Thanks
-
> 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;
-
-
я бы сказал - по ссылке немного менее грамотный ответ. Да еще и с неочевидной ошибкой.
-
Да еще и с неочевидной ошибкой.
А жирное в твоем коде это что?
CloseHandle(Info^.pi.hThread);
-
Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает? А я так делаю: 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;
-
> А жирное в твоем коде это что? > > CloseHandle(Info^.pi.hThread);
Опечатка. От прежнего проекта осталась.
|