안녕 하세요?
BacTeria 박종민 입니다.
제 생각엔 외부 프로그램 실행시에 CreateProcess 함수로 실행 시킨후 종료 여부를
확인 후에 처리해 주시는게 나을듯 싶네요.
제가 예전에 답변했던 내용을 아래에 첨부 합니다. 참고 하세요.
이만... 청주에서 박종민...
------------------------------------------------------------------------------
┌───────────────────────────────────┐
│ ▶ 번 호 : 1071/1231 ▶ 등록자 : 박테리아 │
│ ▶ 등록일 : 1999년 08월 04일 02:18 │
│ ▶ 제 목 : [답변] WinExec로 실행된 프로그램 끝날때까지 기다리는 ? │
└───────────────────────────────────┘
안녕 하세요?
BacTeria 박종민 입니다.
음... WinExec 함수를 써서 프로그램을 실행시키면 종료 여부를 확인 할 방법이
없습니다.
그 대안으로 아래와 같이 CreateProcess 를 쓰는 방법을 권해 드립니다.
소스를 보시면 아시겠지만 계산기 프로그램을 5번 계속해서 실행시켜줍니다.
이만...
청주에서 박종민...
PS. 강제적으로 프로그램을 종료 하려면 이렇게 해주시면 됩니다.
=> TerminateProcess(ProcessInfo.hProcess, 0); // ProcessInfo 가 전역으로
// 선언 되어 있어야겠죠?
------------------------------------------------------------------------------
procedure RunProgram(FileName: String);
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
Created_OK: Boolean;
begin
FillChar(StartupInfo, Sizeof(TStartupInfo), #0);
FillChar(ProcessInfo, Sizeof(TProcessInformation), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_FORCEONFEEDBACK;
Created_OK := CreateProcess(nil, PChar(FileName), nil, nil, False,
CREATE_NEW_CONSOLE + NORMAL_PRIORITY_CLASS,
nil, nil, StartupInfo, ProcessInfo);
if Created_OK then
while WaitForSingleObject(ProcessInfo.hProcess, 10) = WAIT_TIMEOUT do
Application.ProcessMessages;
CloseHandle(ProcessInfo.hProcess);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Byte;
begin
for i := 1 to 5 do
RunProgram('Calc.exe');
end;
|