有没有一种简单的方法,可以监视一个exe文件是否运行或死掉,一但发现   立即重启此exe程序.改注册表能不能实现???
   附上我自己写的一个按时间定时重启exe的源程序,大家研究一下;
   http://www.sojibar.com/images/upfile/run2006-10-14.rar   顺便帮我想个更好的方法,谢谢!

解决方案 »

  1.   

    采用进程监视方法,创建该EXE进程后,会得到一个关于这个进程信息的结构对象。然后调用GetExitCodeProcess,如果退出码为STILL_ACTIVE表示进程还在运行,反之则进程已经关闭
      

  2.   


      woshihaoge 感谢!  是否有点复杂.
      

  3.   


      <b> 能不能说具体一点 </b>
      

  4.   


      woshihaoge 感谢!  按你的方法,我实现了,不知道碰到程序假死,会不会生效。还没有测试到。  代码:  public
        { Public declarations }
        SI       : TStartupInfo;
        PI       : TProcessInformation;  form.show 加入:  FillChar(SI,sizeof(SI),#0);
      with SI do
      begin
        cb:=sizeof(SI);
        dwFlags:=StartF_UsesTDHandles or STARTF_USESHOWWINDOW;
        lptitle:=nil;//pchar('gxtvodserver');
        wShowWindow:=SW_Show;
      end;  //Application.ProcessMessages;
      CreateProcess(PChar(exefile),nil,nil,nil,true,IDLE_PRIORITY_CLASS,nil,nil,SI,PI);
      //MyHandle:=OpenProcess(PROCESS_TERMINATE, true, pi.dwProcessId);  //开始监控
      Timer1.Enabled:=TRUE;procedure TForm1.Timer1Timer(Sender: TObject);
    var
      ExitCode:DWORD;
    begin  //Handle:=OpenProcess(PROCESS_TERMINATE, true, PI.dwProcessId);
      GetExitCodeProcess(PI.hProcess, ExitCode);
      if not(ExitCode=STILL_ACTIVE) then       //STILL_ACTIVE
      begin
        //showmessage('进程已经关闭');
        Timer1.Enabled := FALSE ;
        if chksetting() then
        begin
          RestartSvr();//start service
        end;
      end;
      

  5.   

    其实最最笨的还有一个方法,就是在一个计时器控件事件中,不断用FindWindow函数检测你运行的程序是否存在,如果不存在了,可以用ShellExecute执行。
      

  6.   


      FindWindow 不准确,回勿杀进程!