一个比较方便的关闭进程函数
2014-05-06 17:31
337 查看
原创哦...如果有更好的功能或者BUG修订请通知我, 谢谢
uses TlHelp32, PsAPI; {AFile: 要结束的进程 AEffectFirst: 是否只结束第一个找到的进程 可以只输入EXE名称, 或者全路径+文件名, 或者只是某个文件路径 如果输入的只是某个路径, 则关闭属于这个路径下的所有进程} function KillProcess(AFile: string; AEffectFirst: Boolean = True): WORD; const PROCESS_TERMINATE = $0001; var nContinueLoop: BOOL; nSnapShotHandle: THandle; nProcessEntry32: TProcessEntry32; nSelfID, nPrHandle: Cardinal; nMBF: array [0..MAX_PATH] of Char; nCMode: Byte; {0:检测全路径文件, 1:仅检测文件 2:仅检测路径} nCPath, nCFile, nStr, nFile, nPath: string; nDA: DWORD; begin Result := 0; AFile := UpperCase(AFile); nCPath := ExtractFilePath(AFile); nCFile := ExtractFileName(AFile); if (nPath <> '') and (nCFile <> '') then nCMode := 0 else if nCFile <> '' then nCMode := 1 else if nCPath <> '' then nCMode := 2 else Exit; nSelfID := GetCurrentProcessID; nSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0); try nProcessEntry32.dwSize := SizeOf(nProcessEntry32); nContinueLoop := Process32First(nSnapShotHandle, nProcessEntry32); while nContinueLoop do begin if nProcessEntry32.th32ProcessID <> nSelfID then begin nStr := UpperCase(nProcessEntry32.szExeFile); nFile := ExtractFileName(nStr); {想运行到XP上需要指定这个值, 因为在高版本Delphi上这个值最后会变成$FFFF 导致编译的程序在XP系统上获取句柄失败} nDA := STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $FFF; nPrHandle := OpenProcess(nDA, False, nProcessEntry32.th32ProcessID); try if nCMode <> 1 then begin nPath := ExtractFilePath(nStr); if nPath = '' then begin {此处据说在64位系统上会执行失败, win10-X64未发现 替代方案是, 如果是vista以上的版本使用QueryFullProcessImageName替代 KERNEL32.dll QueryFullProcessImageName} if GetModuleFileNameEx(nPrHandle, 0, @nMBF[0], SizeOf(nMBF)) > 0 then nPath := UpperCase(ExtractFilePath(nMBF)); end; end; if ((nCMode = 0) and (nPath = nCPath) and (nFile = nCFile)) {全路径文件名相同} or ((nCMode = 1) and (nFile = nCFile)) {文件名相同} or ((nCMode = 2) and (Copy(nPath, 1, Length(nCPath)) = nCPath)) {路径包含} then begin TerminateProcess(nPrHandle, 0); {强制关闭进程} if AEffectFirst then Break; end; finally CloseHandle(nPrHandle); end; end; nContinueLoop := Process32Next(nSnapShotHandle, nProcessEntry32); end; finally CloseHandle(nSnapShotHandle); end; end;
相关文章推荐
- 一个比较方便的转换NSString为UTF8编码的函数
- 一个比较方便的转换NSString为UTF8编码的函数
- 一个比较方便的转换NSString为UTF8编码的函数
- Django一个比较隐含的函数url(转)
- 创建进程置新进程的父进程为指定进程 附 一个提权函数 一个进程名寻进程ID函数
- 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]-CodeForces 236A,虽然很水,但有一个很简单的函数用起来方便
- 转载一个比较有意思的程序函数,呵! result love(boy, girl)
- String的本质是一个char*,只是以类的形式提供,使用起来比较方便
- 编写一个函数模板,可对两个任意格式的数值(包括字符格式)进行比较,返回两者的最小值,同时保证较高的精度。
- kill 进程一个简单函数接口
- 一个比较少见,但调试有用的函数
- 习题 6.14 编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2, 输出0;若s1<s2,输出一个负数。不要用strcmp函数。两个字符串用gets函数输入。
- fork()调用的一个趣题--fork函数能生成几个子进程???
- 学习笔记:openwrt listen & send 合并在同一个进程准备用于IPC源码(epoll_fd 在 send event 完成后关闭导致listen终止的问题)
- 以下是一个完整的关闭excel进程的例子
- P279_1017 写一函数,实现两个字符串的比较,即自己写一个strcmp函数
- 编写函数,对标准输入进行扫描,并对“the”出现的次数进行计数。 进行比较时应区分大小写。认为一个单词有一个或多个空格字符分隔, 并且输入行在长度上不会超过100个字符,计数结果输出。
- CloseHandle 函数--关闭一个句柄
- exec函数族可以在进程中执行另外一个程序,字符串复制函数strncpy