全部博文(788)
分类:
2009-02-03 09:56:33
采用进程监视方法,创建该EXE进程后,会得到一个关于这个进程信息的结构对象。然后调用GetExitCodeProcess,如果退出码为STILL_ACTIVE表示进程还在运行,反之则进程已经关闭
woshihaoge 感谢!
是否有点复杂.
一般来说是用进程监视的方法!很多木马或流氓软件都是这么做的!
能不能说具体一点
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 不准确,回勿杀进程!