![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CreateProcess и ожидание его завершения [D5, WinXP]
Илья_ © (2009-02-20 20:28:00)Необходимо запустить из autorun.exe, программу установки и дождаться пока она завершит работу. Использую такой код:
procedure TMainForm.RunApp(const CmdStr: String);
var
SInfo: TStartupInfo;
PInfo: TProcessInformation;
begin
FillChar(SInfo, SizeOf(SInfo), 0);
SInfo.cb := SizeOf(SInfo);
CreateProcess(nil, PChar(CmdStr), nil, nil, False, 0, nil, nil, SInfo, PInfo);
WaitForSingleObject(PInfo.hProcess, INFINITE);
CloseHandle(PInfo.hProcess); // ?????
CloseHandle(PInfo.hThread); // ?????
end;
Нужны ли здесь команды "CloseHandle"?
И вообще, как бы вы решили эту задачу?
Eraser (2009-02-24 17:35:00) [1]раз уж пошла такая пьянка приведу тоже полезную ссылочку http://blog.delphi-jedi.net/2008/04/11/createprocess-in-full-glory/
Ega23 (2009-02-24 13:40:00) [2]
> Необходимо запустить из autorun.exe, программу установки
> и дождаться пока она завершит работу.
Когда-то Игорь Шевченко поделился таким кодом:
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;
Пример вызова (выдрано с мясом):
if not FileExists(FUnZipExeFileName) then Exit;
cmd := ' -q -o ' + Item.FileName + ' META-INF/manifest.xml -d ' + FOOUnzipDir;
RunAndWait(FUnZipExeFileName, cmd, False);
Result := FileExists(FOOManifestFileName);
Юрий Зотов (2009-02-24 13:38:00) [3]> Илья_ (20.02.09 20:28)
if CreateProcess(nil, PChar(CmdStr), nil, nil, False, 0, nil, nil, SInfo, PInfo) then
begin
CloseHandle(PInfo.hThread);
WaitForSingleObject(PInfo.hProcess, INFINITE);
CloseHandle(PInfo.hProcess);
end;
Германн (2009-02-21 00:28:00) [4]
> И вообще, как бы вы решили эту задачу?
>
В добавок к написанному проверял бы ещё и результат возвращаемый функциейCreateProcess. Ведь не случайно это именно функция, а не процедура!
Eraser (2009-02-20 22:02:00) [5]> [0] Илья_ (20.02.09 20:28)
> Нужны ли здесь команды "CloseHandle"?
> И вообще, как бы вы решили эту задачу?
нужны.
примерно так же.