`
java-mans
  • 浏览: 11423426 次
文章分类
社区版块
存档分类
最新评论

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
);

分享到:
评论

相关推荐

    DELPHI强制关闭进程

    .我这个程序只是强制关闭某个进程..需要的朋友可以下载

    Delphi进程查找

    使用Delphi编写,可以查找到本机正在运行的进程,还可以通过杀进程的方法强制某一进程结束。

    Delphi查找和杀死进程实例

    Delphi查找和杀死进程实例,已经完全测试通过,很好用!

    使用HOOK拦截任务管理器中直接杀进程的消息

    在这里,给大家一个Delphi的源码,使用HOOK进行拦截处理任务管理器来实现. 在附件的文档中包含了源码,共分为两个部分:exe测试部分,Dll部分(HookDll,unithook). 我已经亲自编译测试过,可以实现拦截任务管理器的消息. ...

    Delphi5开发人员指南

    4.3.1 一个项目一个目录 82 4.3.2 共享代码的单元 82 4.3.3 多项目管理 84 4.4 Delphi 5项目的框架类 84 4.4.1 TForm类 84 4.4.2 TApplication类 89 4.4.3 TApplication的方法 91 4.4.4 TApplication的事件 92 4.4.5...

    delphi写的关机助手

    主菜单调出后,可查看相应进程,及保存和结束进程资料,以备有问题时 核对。 网络对钟可从右键点击钟表图标弹出的菜单中点击调出。IP工具亦从右键 点击钟表图标弹出的菜单中点击调出,其中解析域名须双击。 ...

    嵌入EXCEL到窗体.rar

    EXCEL嵌入到主程序中,方式一感觉有点BUG,会影响其他打开的EXCEL 方式二貌似没问题 强制结束主程序后,EXCEL进程还保留着,这个暂时没找到啥好方法处理

    小牛电脑计时软件 2.0版

    虽然此软件可以在进程中结束进程,但作者考虑再三,觉得没必要不允许结束进程。此软件是辅助管理,而不是强制管理,否则就违背了设计者的初衷。  9.本软件完全免费,不用注册使用全部功能。本软件不得用于非法商业...

    小牛电脑计时软件v2.0

    虽然此软件可以在进程中结束进程,但作者考虑再三,觉得没必要不允许结束进程。此软件是辅助管理,而不是强制管理,否则就违背了设计者的初衷。 9.本软件完全免费,不用注册使用全部功能。本软件不得用于非法商业...

    C#微软培训资料

    第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 3.5 小 结 .27 第二部分 C#程序设计基础.28 第四章 数 据 类 型 .28 4.1 值 类 型...

    易语言程序免安装版下载

     静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个EXE/DLL中的支持库,该支持库中的数据或资源将不能再被其它EXE/DLL中所使用的同名支持库访问。这是因为代码被分别...

    网管教程 从入门到精通软件篇.txt

    Axx:ARJ压缩文件的分包序号文件,用于将一个大文件压至几个小的压缩包中(xx取01-99的数字) A3L:Authorware 3.x库文件 A4L:Authorware 4.x库文件 A5L:Authorware 5.x库文件 A3M,A4M:Authorware Macintosh...

Global site tag (gtag.js) - Google Analytics