프로세스를 실행시킨 후,
함께 살아가다가 해당 프로세스 종료시 같이 죽기.





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;










Posted by bloodguy
,