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

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

Дождаться завершения выполнения процесса [D5, WinXP]


harisma ©   (2008-06-09 16:09:00) 

Здравствуйте. В программе по кнопке создается некий внешний процесс используя API функцию CreateProcess. Все работало нормально, но возникла необходимость теперь запустив процесс на выполнение, ДОЖДАТЬСЯ ЕГО ЗАВЕРШЕНИЯ, переведя программу в ждущий режим. Каким образом программа может узнать, что запущенный внешний процесс завершился?
Спасибо.


Тын-Дын   (2008-06-10 14:20:00) [1]


> А жирное в твоем коде это что?
>
> CloseHandle(Info^.pi.hThread);

Опечатка. От прежнего проекта осталась.


Игорь Шевченко   (2008-06-10 11:11:00) [2]

Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает?

А я так делаю:

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;


Поросенок Винни-Пух   (2008-06-10 11:03:00) [3]

Да еще и с неочевидной ошибкой.

А жирное в твоем коде это что?

CloseHandle( Info^.pi.hThread);


Тын-Дын   (2008-06-10 10:35:00) [4]

я бы сказал - по ссылке немного менее грамотный ответ. Да еще и с неочевидной ошибкой.


Германн   (2008-06-10 01:47:00) [5]


> Тын-Дын ©   (09.06.08 21:21) [3]

Не ты ли жалился про трудности в поиске по местному ФАКу?
http://delphimaster.ru/cgi-bin/search.pl?words=CreateProcess&n=101
Вторая ссылка содержит твой ответ.
Кстати более грамотный.чем твой. Чуть-чуть более, но всё-таки более!


Тын-Дын   (2008-06-09 21:21:00) [6]


> harisma   (09.06.08 16:36) [2]


Если с нерусского из [1] перевести на нормальный, то получим пример:

function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
 pi:PROCESS_INFORMATION;
 si:STARTUPINFO;
 cmdLine,Path: String;
begin
 ZeroMemory(@si,sizeof(si));
 si.cb:=SizeOf(si);
 si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
 if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
 Path := ExtractFilePath(aCommand);
 cmdLine := aCommand;
 Result :=
        CreateProcess( nil,
                       PChar(cmdLine),
                       nil,
                       nil,
                       False,
                       0,
                       nil,
                       PChar(Path),
                       si,
                       pi );
 if Result then
 begin
   CloseHandle(Info^.pi.hThread);
   if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
   CloseHandle(Info^.pi.hProcess);
 end;
end;


harisma   (2008-06-09 16:36:00) [7]

Thanks


Поросенок Винни-Пух   (2008-06-09 16:11:00) [8]

вэйтфорсинглеобжект энд компания


Наверх

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