启动进程并侦听退出事件

Tes*_*101 4 delphi code-conversion

我有一些代码启动一个进程并挂钩一个事件处理程序来处理进程退出时,我的代码是用C#编写的,我想知道Delphi是否可以实现类似的东西.

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
}
Run Code Online (Sandbox Code Playgroud)

我对Delphi了解不多,所以任何帮助都会受到赞赏,谢谢.

Jim*_*eth 7

是的,你可以用Delphi做类似的事情.我还没有看到使用事件处理程序,但您可以创建一个进程,等待它完成,然后在发生这种情况时执行某些操作.如果你想在同一时间做某事,把它放在另一个线程中.

这里有一些代码用于创建一个进程并等待我从网上删除:

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;
Run Code Online (Sandbox Code Playgroud)

  • 我不会使用 INFINITE 而是使用超时和循环来在需要时能够中断等待,或者使用 WaitForMultipleObject() 事件退出等待。否则可能无法干净地终止等待线程。此外,如果 CreateProcess() 失败,不要隐藏发出通用、无用消息的错误,而是调用 RaiseLasOSError 以显示真正的错误。 (2认同)
  • 另一个提示:FilLChar最后一个参数不需要是一个char - 它可能是一个字节.为避免Unicode问题,如果您只是用零填充二进制结构,则传递0,而不是#0. (2认同)
  • @Jim:在标志中组合位时,应始终使用 OR 而不是 +。您在位标志级别进行操作,加法可能会为您提供与二进制 OR 不同的结果。 (2认同)