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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种集成开发环境(IDE),用于创建Windows应用程序。在Delphi,可以使用编程语言(如Object Pascal)编写代码来处理各种任务,包括操作系统进程的管理。 要结束一个进程,可以使用Delphi的一些函数和类来实现。其一个方法是使用`TerminateProcess`函数,该函数会终止指定进程的执行。可以使用进程进程ID(PID)来标识要结束进程。 以下是在Delphi结束进程的简单示例代码: ```pascal {$APPTYPE CONSOLE} uses SysUtils, Windows; procedure TerminateProcessByName(const AProcessName: string); var ProcessID: DWORD; ProcessHandle: THandle; begin // 根据进程名称查找进程ID ProcessID := GetProcessByName(AProcessName); // 打开进程句柄 ProcessHandle := OpenProcess(PROCESS_TERMINATE, False, ProcessID); if ProcessHandle <> 0 then begin // 终止进程 TerminateProcess(ProcessHandle, 0); // 关闭进程句柄 CloseHandle(ProcessHandle); WriteLn('进程已成功终止!'); end else WriteLn('找不到该进程!'); end; begin try // 结束名为"zishen.exe"的进程 TerminateProcessByName('zishen.exe'); except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. ``` 上述代码,`TerminateProcessByName`过程接收进程名称作为参数,通过`GetProcessByName`函数查找进程ID,然后使用`OpenProcess`打开进程句柄。接着,`TerminateProcess`函数用于终止进程,`CloseHandle`关闭进程句柄。最后,显示终止结果。 需要注意的是,在使用`TerminateProcess`函数时需要小心,因为它会强制终止进程而不会进行任何清理工作。因此,建议在终止进程之前先和相关进程通信,并进行必要的资源释放。此外,必须谨慎使用这种操作,以防止意外关闭系统关键进程或其他危险情况的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值