Delphi中强制结束一个进程

来源:互联网 发布:淘宝卖家账号怎么注册 编辑:程序博客网 时间:2024/05/16 01:32

强制结束一个进程的 API 为 TerminateProcess


BOOL TerminateProcess(
HANDLE hProcess, // 进程句柄
UINT uExitCode // 退出代码
);

你可以使用语句 invoke TerminateProcess,structProcInfo.hProcess,0 来结束进程,要注意的是如果可能的话,尽量不要在程序中强制结束别的进程,因为使用 TerminateProcess 结束的进程,它装载的 dll 不能被正确卸载。这样可能会引起系统资源的无效占用。最好的办法在进程中自己使用 ExitProcess 退出。

Delphi中强制结束一个进程
AFileName指定xxx.exe就行了,如Excel.exe
先Uses TLHelp32;

procedure EndProcess(AFileName: string);
const
PROCESS_TERMINATE=$0001;
var
ExeFileName: String;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ExeFileName := AFileName;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
    begin
      if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
           UpperCase(ExeFileName))
       or (UpperCase(FProcessEntry32.szExeFile) =
           UpperCase(ExeFileName))) then
        TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
                          FProcessEntry32.th32ProcessID), 0);
      ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
    end;
end;

------------------------------------------------------------------------------------
   
在NT下:进程是由内核统一管理的,用户态的程序是不能处理的,在核心有进程的执行体进程块EPROCESS,EPROCESS结构包含有一个异常本地过程调用端口(LPC),LPC是当进程中的一个线程引起异常时,进程管理器发送信息的内部进程通信通道。如果可以访问这个结构的话,就可以将LPC指向我们自己的入口,但遗憾的是EPROCESS在用户态下是无法访问的,所以无法实现。线程的情况和这类似,也有执行体线程块ETHREAD。  


   给你一个最简单的方法:  
   
另外写一个程序来监测你的程序操作。  
假设你的程序为abc.exe,  
监测程序为watch.exe  
   
监测程序完成这样一个功能:  
1.   每隔一段时间检测一下系统的所有窗口进程(例如10秒)  
        利用EnumWindows()得到的窗口句柄。判断是否为错误报警的窗口发生。  
        错误报警的窗口的标题一般都有:"某某程序执行了非法操作"的字样,很好判断。  
2.   一旦确定下来,就可将其从容关闭再重新启动。  
   
这个方法我试过。我曾写过一个专业作弊软件,让其自动运行。当IE  
出错时就将其关闭,然后重启IE。  
   
你可以去我的主页这个栏目看一下:  
http://www.ChinaITHero.com/th_money.htm     第5节:自动关闭错误窗口  
   
=============================================================================

最简单的办法是:  
          在需要被监视的程序中添加一个发送机制,比如每1分钟向守护进程发送一个自定义消息.  
守护进程则进行判断,如果1分钟以上还未收到该消息,则关闭该进程

=============================================================================

我想做一个监控某个进程是否正常运行的程序,用  
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
和PROCESSENTRY32结构  
取得了这个进程,但就是不知道怎么判断它的状态,请高手赐教!

定义发送消息,枚举窗口等

Win   9x为IsHungThread  
   
在Win   NT/2000中为IsHungAppWindow。

调用User32.dll中一个未公开的函数来实现的。这个函数存在于Windows   9x和Windows   NT/2000系统中,但在两个系统中的名字是不同的。Windows   9x系统中的名字为:IsHungThread,在Windows   NT/2000系统中的名字为IsHungAppWindow。下面是它们的原型:  
BOOL   IsHungAppWindow   (  
HWND   hWnd,   //   主应用窗口句柄  
);  
和  
BOOL   IsHungThread   (  
DWORD   dwThreadId,   //   主应用窗口的线程ID  
);