Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
15-1264145710
Дмитрий С
2010-01-22 10:35
2010.08.27
Атмосфера увеличивается?


2-1265443454
dj kondakov
2010-02-06 11:04
2010.08.27
Обработка сообщений компонентов


15-1265681360
brother
2010-02-09 05:09
2010.08.27
Береги клиента, бабло приносящего


6-1216982606
Uzer32.dll
2008-07-25 14:43
2010.08.27
Доступ к запароленым шарам


2-1274271676
@!!ex
2010-05-19 16:21
2010.08.27
Как эмулировать клик мышкой на Flash плеере