Q&A

  • 2개의 실행파일을 순서대로 시키려면...
버튼클릭또는 하나의 이벤트에서 a.exe, b.exe처럼 실행파일이 2개가 있는데, 이것을 순서대로 처음에 a.exe를 실행시키고 난 후 그 다음 b.exe을 실행시키려면 어떻게 하죠?
델파이를 설치하다 보면 델파이가 셋업되고, 인터베이스가 셋업되게 되어있는 것처럼요...인스톨쉴드를 사용안하고 코딩으로 구현해보려거든요...
winexec를 사용하니 2개가 동시에 실행이 되어버리는데...
여기 자료를 검색하니 1개의 실행시키는 방법밖에 못찾았습니다.
고수님들의 도움 부탁드립니다...
모두 즐코하시고 행복하세요...
2  COMMENTS
  • Profile
    구창민 2002.11.30 19:44
    안녕하세여 구창민입니다.

    님의 질문의 요지는 특정 프로그램을 실행시키고 그 프로그램이
    끝날때 까지 대기 했다가 다음 프로그램을 수행시켜야 한다는 것이군여.

    간단히 하나 이렇게 짜세여

    function isRun(ClassName : string) : Boolean;
    var
      H: HWND;
    begin
      Result := True;
      H := FindWindow(PChar(ClassName), nil);
      if H = 0 then Result := False;
    end;


    procedure TForm1.Button1Click(Sender: TObject);
    begin
      WinExec('notepad.exe', SW_SHOWNORMAL);
      // 실행시킨 노트패드가 종료될때까지 대기
      while isRun('Notepad') do Application.ProcessMessages;

      WinExec('calc.exe', SW_SHOWNORMAL);
      //실행시킨 계산기가 끝날때 까지 대기
      while isRun('SciCalc') do Application.ProcessMessages;

      //모두 종료되면 'OK' 메세지 출력
      ShowMessage('OK');
    end;



    예? 맘에 안드신다구여? ㅡㅜ;

    더 뽀다구 나게 짜야 된다구여?  그럼 아래코드를 사용하세여.

    아래는 위 코드와 동일하게 동작합니다.

    그럼 즐거운 프로그래밍 하시길~~~

    function WinExecAndWait32(FileName : PChar; CommandLine : PChar; Visibility : Integer) : integer;
    var
      zAppName:array[0..512] of char;
      zCurDir:array[0..255] of char;
      WorkDir:ShortString;
      StartupInfo:TStartupInfo;
      ProcessInfo:TProcessInformation;
    begin
      StrCopy(zAppName, FileName);
      StrCat(zAppName, CommandLine);
      GetDir(0, WorkDir);
      StrPCopy(zCurDir, WorkDir);
      FillChar(StartupInfo, Sizeof(StartupInfo),#0);
      StartupInfo.cb := Sizeof(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow := Visibility;
      Application.ProcessMessages;
      if not CreateProcess(nil,
          zAppName,
          nil,
          nil,
          false,
          CREATE_NEW_CONSOLE or
          NORMAL_PRIORITY_CLASS,
          nil,
          nil,
          StartupInfo,
          ProcessInfo) then
        Result := -1
      else
      begin
        WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
        GetExitCodeProcess(ProcessInfo.hProcess, DWORD(Result));
      end;
    end;


    procedure TForm1.Button1Click(Sender: TObject);
    var ret: integer;
    begin
      while WinExecAndWait32(PChar('notepad.exe'), PChar(''), 1) <> 0 do
        Application.ProcessMessages;
      while WinExecAndWait32(PChar('calc.exe'), PChar(''), 1) <> 0 do
        Application.ProcessMessages;
      ShowMessage('OK');
    end;
  • Profile
    이치영 2002.12.02 18:56
    답변에 감사드립니다...
    많은 도움이 되었습니다...
    즐코 하시고 행복하세요...