2010-01-05 2 views
3

나는 프로세스를 시작하고 프로세스가 종료가, 내가 가지고있는 코드는 C#으로 작성하고 내가 비슷한 델파이 가능합니다 궁금 할 때 처리 할 이벤트 핸들러를 사귀는 몇 가지 코드를 .프로세스를 시작 및 종료 이벤트를 수신

System.Diagnostics.Process myProcess = new System.Diagnostics.Process(); 
myProcess.StartInfo.FileName = "notepad.exe"; 
myProcess.EnableRaisingEvents = true; 
myProcess.Exited += new System.EventHandler(Process_OnExit); 
myProcess.Start(); 

public void Process_OnExit(object sender, EventArgs e) 
{ 
    //Do something when the process ends 
} 

저는 델파이에 대해 잘 모릅니다. 감사합니다.

답변

6

네, 델파이와 비슷한 것을 할 수 있습니다. 나는 이벤트 핸들러를 사용하는 것을 보지 못했지만, 프로세스를 생성하고, 프로세스가 끝나기를 기다린 다음, 일어날 때 무언가를 할 수있다. 다른 시간에 뭔가를하고 싶다면 다른 스레드에 넣으십시오.

procedure ExecNewProcess(ProgramName : String; Wait: Boolean); 
var 
    StartInfo : TStartupInfo; 
    ProcInfo : TProcessInformation; 
    CreateOK : Boolean; 
begin 
    { fill with known state } 
    FillChar(StartInfo,SizeOf(TStartupInfo), 0); 
    FillChar(ProcInfo,SizeOf(TProcessInformation), 0); 
    StartInfo.cb := SizeOf(TStartupInfo); 
    CreateOK := CreateProcess(nil, PChar(ProgramName), nil, nil,False, 
       CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS, 
       nil, nil, StartInfo, ProcInfo); 
    { check to see if successful } 
    if CreateOK then 
    begin 
     //may or may not be needed. Usually wait for child processes 
     if Wait then 
     WaitForSingleObject(ProcInfo.hProcess, INFINITE); 
    end 
    else 
    begin 
     //ShowMessage('Unable to run '+ProgramName); 
     SysErrorMessage(GetLastError()); 
    end; 

    CloseHandle(ProcInfo.hProcess); 
    CloseHandle(ProcInfo.hThread); 
end; 
+1

내가 INFINITE 사용하지 것이다하지만 시간 제한 및 루프가 필요한 경우 대기를 중단 할 수 또는 WaitForMultipleObject하기 : 여기

내가 그물을 긁어하는 프로세스를 생성하고 대기에 대한 몇 가지 코드() 이벤트를 기다림을 종료합니다. 그렇지 않으면 대기중인 스레드를 완전히 종료 할 수 없습니다. 또한 CreateProcess()가 실패하면 일반적인 오류 메시지를 표시하지 말고 RaiseLasOSError를 호출하여 실제 오류를 표시하십시오. –

+2

또 다른 힌트 : FilLChar 마지막 ​​매개 변수는 char 일 필요가 없습니다. 바이트 일 수 있습니다. 유니 코드 문제를 피하려면, 이진 구조체에 0을 채우는 경우 # 0이 아닌 0을 전달하십시오. –

+0

좋은 조언 @ldsandon. 두 가지 모두 프로덕션 코드에서 수행했습니다. –

관련 문제