Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизCreateProcess и ожидание его завершения Найти похожие ветки
← →
Илья_ (2009-02-20 20:28) [0]Необходимо запустить из 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-20 22:02) [1]> [0] Илья_ (20.02.09 20:28)
> Нужны ли здесь команды "CloseHandle"?
> И вообще, как бы вы решили эту задачу?
нужны.
примерно так же.
← →
Германн © (2009-02-21 00:28) [2]
> И вообще, как бы вы решили эту задачу?
>
В добавок к написанному проверял бы ещё и результат возвращаемый функцией CreateProcess. Ведь не случайно это именно функция, а не процедура!
← →
Юрий Зотов © (2009-02-24 13:38) [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;
← →
Ega23 © (2009-02-24 13:40) [4]
> Необходимо запустить из 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);
← →
Eraser © (2009-02-24 17:35) [5]раз уж пошла такая пьянка приведу тоже полезную ссылочку http://blog.delphi-jedi.net/2008/04/11/createprocess-in-full-glory/
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.062 c