Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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"?
> И вообще, как бы вы решили эту задачу?

нужны.
примерно так же.


Наверх

Титульная страница Поиск, карта сайта Написать письмо