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

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

Как подождать завершения приложения [D6, D7, Win95/98]


lhs7fy ©   (2004-01-16 12:47:00) 

Помогите разобраться!
Допустим моя программа запускает с помощью функции
ShellExecuteкакое-нибудь приложение, как сделать так,
чтобы моя програ ещё и подождала завершения выполнения
этого приложения?


Edward   (2004-01-16 15:41:00) [1]


//----------------------------------------------------------------------------
//Запуск внешних программ
// APath: командная строка
// Mode:  режим запуска: SW_SHOWNORMAL,
//                       SW_SHOWMINIMIZED,
//                       SW_SHOWMAXIMIZED,
//                       SW_HIDE
// Wait:  0 - не ждать завершения процесса (по умолчанию),
//        1 - ждать завершения процесса,
// Возвращаемое значение: при Wait = 0, возвращает:
//                                  -1  - ошибка запуска,
//                                   0  - процесс запущен
//                        при Wait = 1, возвращает:
//                                  -1  - ошибка запуска,
//                                   Код завершения (определяется программой,
//                                                   которая запускается)
//----------------------------------------------------------------------------
function TMainForm.iWinExecute(APath: String; Mode, Wait: Integer): Integer;
var lpProcessInformation: TProcessInformation;
   P: array[0..254] of Char;
   lpStartupInfo: TStartupInfo;
   R: LPDWORD;
begin
 Result := -1;
 FillChar(lpStartupInfo, SizeOf(TStartupInfo), $00);
 with lpStartupInfo do
   begin
     lpDesktop   := nil;
     lpTitle     := nil;
     dwFlags     := STARTF_USESHOWWINDOW;
     wShowWindow := Mode;
  end;
  FillChar(P, SizeOf(P), $00);
  StrPCopy(P, APath);
  if CreateProcess(nil, P, nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil,
                   nil, lpStartupInfo, lpProcessInformation) then
    begin
      if Wait = 1 then
        begin
          WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
          Result:= lpProcessInformation.hProcess;
          New(R);
          if GetExitCodeProcess(lpProcessInformation.hProcess, R^) then Result:= R^;
          CloseHandle(lpProcessInformation.hProcess);
        end
    else
      Result:= 0;
    end;
end;


Rext   (2004-01-16 15:17:00) [2]

Попробуй так:
.
.
var si : StartUpInfo;
   pi : Process_Information;
   PathStr : string;
.
.
.
ZeroMemory(@si,SizeOf(si));
si.cb:=SizeOf(si);
if not CreateProcess(nil,PChar(PathStr),nil,nil,false,0,nil,nil,si,pi) then
begin
  MessageDlg('Ошибка запуска файла'+PathStr,mtError,[mbOk],0);
  exit;
end;
WaitForSingleObject(pi.hProcess,Infinite);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
.
.
.

У меня в проге это работает.

Удачи.


Digitman   (2004-01-16 13:34:00) [3]


> lhs7fy


вместо ShellExecute используй ShellExecuteEx
последняя в составе структуры SHELLEXECUTEINFO возвратит тебе хэндл созданного процесса. который ты можешь использовать в кач-ве хендла объекта синхронизации любой из WairFor-семейства функций, ожидающих наступление событий

следует лишь принять во внимание комментарий к полю hProcess в составе структуры SHELLEXECUTEINFO :

hProcess

Handle to the newly started application. This member is set on return and is always NULL if fMask is not set to SEE_MASK_NOCLOSEPROCESS


Serge   (2004-01-16 13:11:00) [4]

Поищи инфу насчет
CreateProcess


Наверх

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