Тема: WinExec32AndWait
В связи с повышенным интересом к "ожиданию завершения работы внешнего приложения" и затяжным молчанием тех, кто знает как это реализовывается привожу вариант функции WinExec32AndWait.
Я вообще в WinApi слабоват и поэтому полазил по Инету в поисках этой функции, нашел несколько вариантов, объединил их в один (как мне показалось более приемлимый и понятный), добавил немного коментариев к уже имеющимся и привожу что получилось.
Функция работает. Проверил сделав COM-сервер в DLL и обратившись к нему из Lisp-а.
function WinExec32AndWait(FileName : String) : Boolean; var si : TStartupInfo; pi : TProcessInformation; begin ZeroMemory(@si,sizeof(si)); si.cb := SizeOf(si); if not CreateProcess( nil, PChar(FileName), // указатель командной строки nil, // указатель на процесс атрибутов безопасности nil, // указатель на поток атрибутов безопасности False, // флаг родительского обработчика 0, // флаг создания nil, // указатель на новую среду процесса nil, // указатель на имя текущей директории si, // указатель на StartupInfo pi) // указатель на ProcessInformation then Result := False // если не удалось запустить процесс else begin // ожидаем завершение процесса (INFINITE -> время ожидания неопределено) If WaitForSingleObject(pi.hProcess, INFINITE) = WAIT_FAILED then Result := False // если подождать не удалось else Result := True; // если подождать удалось CloseHandle(pi.hProcess); CloseHandle(pi.hThread); end; end;
Я не претендую на правильность и истинность этой функции. Просто, может быть кому пригодится или кто-то подправит и т.д.
Вообще, давайте в этой ветке создадим тему типа "Делимся находками" и будем делиться. Если кто поддержит, то я тему создам. А то все ходят кривотолки - "можно так, можно эдак". Давайте действовать, товарищи.
P.S. Хотя может я один такой дурак.