鱼C论坛

 找回密码
 立即注册
查看: 2812|回复: 3

[技术交流] Delphi强制关闭进程代码详解

[复制链接]
发表于 2013-3-16 20:05:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
CreateToolhelp32Snapshot函数通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程[THREAD]建立一个快照[snapshot]。
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags, //用来指定“快照”中需要返回的对象,可以是TH32CS_SNAPPROCESS等
DWORD th32ProcessID //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取当前进程快照时可以设为0
);
参数:
dwFlags
[输入]指定快照中包含的系统内容,这个参数能够使用下列数值(常量)中的一个或多个。
TH32CS_INHERIT - 声明快照句柄是可继承的。
TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
TH32CS_SNAPHEAPLIST - 在快照中包含在th32ProcessID中指定的进程的所有的堆。
TH32CS_SNAPMODULE - 在快照中包含在th32ProcessID中指定的进程的所有的模块。
TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。
TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
th32ProcessID
[输入]指定将要快照的进程ID。如果该参数为0表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效,在其他情况下该参数被忽略,所有的进程都会被快照。
返回值:
调用成功,返回快照的句柄,调用失败,返回INVALID_HANDLE_VALUE 。

BOOL TerminateProcess(
HANDLE hProcess,//进程句柄
UINT uExitCode //进程终止码
);


process32First 是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄.  
Process32Next(
Handle hsnapShot,
LPPROCESSENTRY32 lppe)
搭配使用,用来枚举当前系统快照相关的所有进程。
函数返回值:成功返回true,否则返回false.


HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);
返回值:
如成功,返回值为指定进程的句柄。
如失败,返回值为空,可调用GetLastError获得错误代码。

  1. uses TLHelp32;
  2. procedure TForm1.EndProcess(AFileName: string);
  3. const PROCESS_TERMINATE = $0001;
  4. var ContinueLoop: BOOL;
  5. FSnapShotHandle: THandle;
  6. FProcessEntry32: TProcessEntry32;
  7. KillHandle: THandle;//用于杀死进程
  8. begin
  9. FSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);
  10. FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  11. while integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(AFileName)) or (UpperCase(FProcessEntry32.szExeFile )=UpperCase(AFileName))) then begin KillHandle := OpenProcess(PROCESS_TERMINATE,
  12. False,
  13. FProcessEntry32.th32ProcessID); TerminateProcess(KillHandle, 0);//强制关闭进程
  14. CloseHandle(KillHandle);
  15. exit;
  16. end;
  17. ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  18. end;
  19. end;
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2016-5-21 18:19:36 | 显示全部楼层
6666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-23 10:46:29 | 显示全部楼层
多谢您的分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-23 11:01:35 | 显示全部楼层
这个我需要。希望测试通过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 10:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表