Форум: "WinAPI";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];
ВнизДождаться завершения выполнения процесса Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.07.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c