Programming/Delphi

다른 프로그램 종료시까지 대기하기

통통만두 2010. 6. 30. 15:34
반응형
// 프로그램에서 서브 프로그램을 실행시킨 후 종료시까지 대기한 후, 종료가 되면 실행
procedure Tfrm_UMS.InstallConversion;
var
   StartupInfo : TStartupInfo;
   ProcessInfo : TProcessInformation;
   nFlag          : Boolean;
   FileName    : String;
   nCardinal    : DWORD;
   nHandle     : HWND;
   Cnt            : Integer;
begin
   VCLUnZip.ClearZip;
   Cnt   := 0;
   nFlag := False;
   FileName := ExtractFilePath(Application.ExeName) + 'plugin' + _USE_CONVERSION_FILE_PATH + 'Setup.exe';

   try
      ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
      StartupInfo.cb := SizeOf(StartupInfo);
      FillChar(ProcessInfo, SizeOf(ProcessInfo), 0);

      with StartupInfo do begin
         cb          := SizeOf(TStartupInfo);
//         dwFlags     := STARTF_USESHOWWINDOW;
         wShowWindow := SW_HIDE;
      end;  // End of with

      // 프로그램을 실행한다.
      nFlag := CreateProcess(nil, PChar(FileName), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
//      WinExecAndWait(FileName, SW_SHOW);
      if nFlag then begin
//         WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
//         ShellExecute(ProcessInfo.hProcess, PChar(FileName), nil, nil, nil, 0);
//         WinExecAndWait(FileName, SW_SHOW);

         // 실행된 프로그램이 종료될 때까지 반복한다.
         while true do begin
            GetExitCodeProcess(ProcessInfo.hProcess, nCardinal);
            if nCardinal = STILL_ACTIVE then begin
               Application.ProcessMessages;
//               Sleep(1000);
               Continue;
            end;
//            ShowMessage('끝내자');
            Break;
         end;  // End of while
//         WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
         CloseHandle(ProcessInfo.hProcess);
         CloseHandle(ProcessInfo.hThread);
      end;
   except
   end;
//   if nHandle > 32 then begin
//   end;

   if FindConVersionDrive then begin
      nHandle := FindWindow(nil, 'ODC Desktop Sample');
      PostMessage(nHandle, WM_QUIT, 0, 0);
      MessageDlg('설치가 완료되었습니다.'#13#10'플러그인을 다시 실행하여주세요.', mtInformation, [mbOK], 0);
      Close;
   end else begin
      MessageDlg('설치가 비정상적으로 종료되었습니다.'#13#10'다시 설치하시기 바랍니다.', mtInformation, [mbOK], 0);
   end;

   // 설치파일 삭제
   try
      EraseDirectory(ExtractFilePath(Application.ExeName) + 'plugin\FaxConversion');
   except
   end;
//   Close;
end;

반응형