Delphi中强制结束一个进程

 强制结束一个进程的 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  
  );
 
 
==========================================

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值