特殊功能,实现方法! Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061118141925203.html
有没有一种简单的方法,可以监视一个exe文件是否运行或死掉,一但发现
立即重启此exe程序.改注册表能不能实现???
附上我自己写的一个按时间定时重启exe的源程序,大家研究一下;
http://www.sojibar.com/images/upfile/run2006-10-14.rar
顺便帮我想个更好的方法,谢谢!
采用进程监视方法,创建该EXE进程后,会得到一个关于这个进程信息的结构对象。然后调用GetExitCodeProcess,如果退出码为STILL_ACTIVE表示进程还在运行,反之则进程已经关闭
woshihaoge 感谢!
是否有点复杂.
一般来说是用进程监视的方法!很多木马或流氓软件都是这么做的!
<b> 能不能说具体一点 </b>
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;
不会是做木马吧
哈哈,你写的代码非常正确,给分拉。
其实最最笨的还有一个方法,就是在一个计时器控件事件中,不断用FindWindow函数检测你运行的程序是否存在,如果不存在了,可以用ShellExecute执行。
最后一抢!
FindWindow 不准确,回勿杀进程!