프로세스를 실행시킨 후,
함께 살아가다가 해당 프로세스 종료시 같이 죽기.
procedure RunAndDieTogether;
var
SecAttr: TSecurityAttributes;
ProcInfo: TProcessInformation;
StartupInfo: TStartupInfo;
cmd: array [0..1023] of WideChar;
dwWaitResult: DWORD;
begin
SecAttr.nLength:=SizeOf(SecAttr);
SecAttr.lpSecurityDescriptor:=nil;
SecAttr.bInheritHandle:=True;
ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.dwFlags:=STARTF_USESHOWWINODW or STARTF_USESTDHANDLES;
StartupInfo.wShowWindow:=SW_SHOW;
ZeroMemory(@cmd, SizeOf(cmd));
StrCopy(cmd, '실행파일경로');
CreateProcess(nil, cmd, @SecAttr, @SecAttr, True, DETACHED_PROCESS or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcInfo);
WaitForInputIdel(ProcInfo.hProcess, INFINITE);
repeat
// 만약 종료전까지 뭔가를 해야 할 경우 아래처럼 처리해야 '응답없음' 상태가 안됨
Application.ProcessMessages;
dwWaitResult:=WaitForSingleObject(ProcInfo.hProcess, 100);
// 실질적인 통신 등은 다른 프로세스에서 이루어지고,
// 실행시킨 프로세스는 단순히 백그라운드에서 대기하다가 같이 죽을려면 아래처럼 해도 무방
dwWaitResult:=WaitForSingleObject(ProcInfo.hProcess, INFINITE);
until dwWaitResult<>WAIT_TIMEOUT;
Application.Terminate;
end;
var
SecAttr: TSecurityAttributes;
ProcInfo: TProcessInformation;
StartupInfo: TStartupInfo;
cmd: array [0..1023] of WideChar;
dwWaitResult: DWORD;
begin
SecAttr.nLength:=SizeOf(SecAttr);
SecAttr.lpSecurityDescriptor:=nil;
SecAttr.bInheritHandle:=True;
ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.dwFlags:=STARTF_USESHOWWINODW or STARTF_USESTDHANDLES;
StartupInfo.wShowWindow:=SW_SHOW;
ZeroMemory(@cmd, SizeOf(cmd));
StrCopy(cmd, '실행파일경로');
CreateProcess(nil, cmd, @SecAttr, @SecAttr, True, DETACHED_PROCESS or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcInfo);
WaitForInputIdel(ProcInfo.hProcess, INFINITE);
repeat
// 만약 종료전까지 뭔가를 해야 할 경우 아래처럼 처리해야 '응답없음' 상태가 안됨
Application.ProcessMessages;
dwWaitResult:=WaitForSingleObject(ProcInfo.hProcess, 100);
// 실질적인 통신 등은 다른 프로세스에서 이루어지고,
// 실행시킨 프로세스는 단순히 백그라운드에서 대기하다가 같이 죽을려면 아래처럼 해도 무방
dwWaitResult:=WaitForSingleObject(ProcInfo.hProcess, INFINITE);
until dwWaitResult<>WAIT_TIMEOUT;
Application.Terminate;
end;
'Delphi' 카테고리의 다른 글
[Delphi] DLL의 Form의 Deactivate 처리 (0) | 2010.04.26 |
---|---|
[Delphi] 다른 어플리케이션에 Ctrl+V 보내기 (0) | 2010.04.26 |
[Delphi] 프로세스ID로 핸들, ThreadID 알아내기 (0) | 2010.04.26 |
[Delphi] DLLMain 사용 (0) | 2010.04.22 |
[Delphi] 특정 프로세스 키보드 후킹 (2) | 2010.04.22 |