您的位置:首页 > 编程语言 > Delphi

Delphi中强制结束一个进程

2008-02-13 09:09 423 查看
强制结束一个进程的 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
);

==========================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: