![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дождаться завершения выполнения процесса [D5, WinXP]
harisma © (2008-06-09 16:09:00)Здравствуйте. В программе по кнопке создается некий внешний процесс используя API функцию CreateProcess. Все работало нормально, но возникла необходимость теперь запустив процесс на выполнение, ДОЖДАТЬСЯ ЕГО ЗАВЕРШЕНИЯ, переведя программу в ждущий режим. Каким образом программа может узнать, что запущенный внешний процесс завершился?
Спасибо.
Тын-Дын (2008-06-10 14:20:00) [1]
> А жирное в твоем коде это что?
>
> CloseHandle(Info^.pi.hThread);
Опечатка. От прежнего проекта осталась.
Игорь Шевченко (2008-06-10 11:11:00) [2]Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает?
А я так делаю:
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 11:03:00) [3]Да еще и с неочевидной ошибкой.
А жирное в твоем коде это что?
CloseHandle( Info^.pi.hThread);
Тын-Дын (2008-06-10 10:35:00) [4]я бы сказал - по ссылке немного менее грамотный ответ. Да еще и с неочевидной ошибкой.
Германн (2008-06-10 01:47:00) [5]
> Тын-Дын © (09.06.08 21:21) [3]
Не ты ли жалился про трудности в поиске по местному ФАКу?
http://delphimaster.ru/cgi-bin/search.pl?words=CreateProcess&n=101
Вторая ссылка содержит твой ответ.
Кстати более грамотный.чем твой. Чуть-чуть более, но всё-таки более!
Тын-Дын (2008-06-09 21:21:00) [6]
> 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;
harisma (2008-06-09 16:36:00) [7]Thanks
Поросенок Винни-Пух (2008-06-09 16:11:00) [8]вэйтфорсинглеобжект энд компания