버튼클릭또는 하나의 이벤트에서 a.exe, b.exe처럼 실행파일이 2개가 있는데, 이것을 순서대로 처음에 a.exe를 실행시키고 난 후 그 다음 b.exe을 실행시키려면 어떻게 하죠?
델파이를 설치하다 보면 델파이가 셋업되고, 인터베이스가 셋업되게 되어있는 것처럼요...인스톨쉴드를 사용안하고 코딩으로 구현해보려거든요...
winexec를 사용하니 2개가 동시에 실행이 되어버리는데...
여기 자료를 검색하니 1개의 실행시키는 방법밖에 못찾았습니다.
고수님들의 도움 부탁드립니다...
모두 즐코하시고 행복하세요...
님의 질문의 요지는 특정 프로그램을 실행시키고 그 프로그램이
끝날때 까지 대기 했다가 다음 프로그램을 수행시켜야 한다는 것이군여.
간단히 하나 이렇게 짜세여
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;