Главная страница
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.156 c
15-1266165222
Czz
2010-02-14 19:33
2010.08.27
Win7 - не запускается проводник 2


6-1220289471
Colonel
2008-09-01 21:17
2010.08.27
Проблема с приложением клиент-сервер


15-1275371179
Дмитрий С
2010-06-01 09:46
2010.08.27
Знатокам MS ISA server 2006. Настройка Publish Web Sites


4-1226996099
Сергей
2008-11-18 11:14
2010.08.27
Как вывести Диалог свойств Windows К оприделённому файлу ?


15-1274747389
Юрий
2010-05-25 04:29
2010.08.27
С днем рождения ! 25 мая 2010 вторник