一个比较方便的关闭进程函数

原创哦...如果有更好的功能或者BUG修订请通知我, 谢谢


uses
TLHelp32, PsAPI;

{AFile: 要结束的进程
AEffectFirst: 是否只结束第一个找到的进程

可以只输入EXE名称, 或者全路径+文件名, 或者只是某个文件路径
如果输入的只是某个路径, 则关闭属于这个路径下的所有进程}
function KillProcess(AFile: string; AEffectFirst: Boolean = True): WORD; overload;
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;
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);
nPrHandle := OpenProcess(PROCESS_ALL_ACCESS, False, nProcessEntry32.th32ProcessID);
try
if nCMode <> 1 then
begin
nPath := ExtractFilePath(nStr);
if nPath = ‘‘ then
begin

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;

一个比较方便的关闭进程函数,布布扣,bubuko.com

时间: 2024-10-10 04:51:06

一个比较方便的关闭进程函数的相关文章

在Linux下利用crond实现一个定时任务并完成一个守护(精灵)进程

一.利用crond实现一个定时任务       在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为"crontab",是"cron table"的简写. crontab支持两种状态: a.直接编写计划任务: b.使用目录的方式,放在目录里面的都会定时执行,定时目录可在/etc/crontab中设定. 为当前用户创建cron服

在CMD命令行下关闭进程的命令

转载: [重要]在CMD命令行下关闭进程的命令━━━━━━━━━━━━━━━━━━━━━━━━━━ 方法一: 在"运行"中输入:ntsd -c q -pn 程序名字(在MS-Dos中的作用是一样的) 方法二: ntsd使用以下参数杀死进程.c:\>ntsd -c q -p PID 只要你能提供进程的PID,那么你就可以干掉进程. 法二: tskill命令 这个命令与tasklist命令是相对应的吧! tasklist命令是显示有哪些进程正在运行! tskill命令是关闭运行中的进

Win7怎么关闭多余进程,怎么关闭无法关闭进程

我们使用电脑的时候,有时候会发现电脑的速度突然变慢了,这时候我们可以查看下自己电脑的进程,看看有没有非常占用CPU的无关进程在使用,这时候我们可以关闭一些占用CPU系统资源比较多的无用进程,但是提醒大家关闭进程大家一定要谨慎操作,否则会导致电脑上一些程序或应用就无法使用哦,可能还有些时候大家发现为啥有些进程无法关闭呢?总是提示无法中止进程,怎么办呢?其实我们不需要使用第三方工具,我们使用电脑的一些DOS命令或者电脑操作就可以进行关闭,这里小编给大家介绍下关闭系统进程的操作方法.希望大家需要时可以

写一个Windows上的守护进程(5)文件系统重定向

写一个Windows上的守护进程(5)文件系统重定向 在Windows上经常操作文件或注册表的同学可能知道,有“文件系统/注册表重定向”这么一回事.大致来说就是32位程序在64位的Windows上运行时,操作系统会把对System32文件夹的访问重定向到SysWow64下,把对HKEY_LOCAL_MACHINE\SOFTWARE的访问重定向到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node下.当然不止这些路径和注册表.详情请查看MSDN:https://msdn.

写一个Windows上的守护进程(4)日志其余

写一个Windows上的守护进程(4)日志其余 这次把和日志相关的其他东西一并说了. 一.vaformat C++日志接口通常有两种形式:流输入形式,printf形式. 我采用printf形式,因为流输入不好控制格式. printf形式要求日志接口支持不定长参数,我没有直接在日志实现类里边支持不定长参数,而是只接受一个字符串参数,可以参见第一篇. 为什么呢? 如果要成为不定长参数,就是这样 bool log_string(const LOG_LEVEL level, const char* fi

写一个Windows上的守护进程(6)Windows服务

写一个Windows上的守护进程(6)Windows服务 守护进程因为要开机启动,还要高权限,所以我就把它做成Windows服务了. 关于Windows服务的官方文档,大家可以看https://msdn.microsoft.com/en-us/library/windows/desktop/ms686953(v=vs.85).aspx. 总的来说,服务的行为区别于普通应用程序的地方有以下几点: 1. 一般来说,服务是运行于System用户下的,当然也可以自己指定.也就是说服务可以在无用户登录的情

写一个Windows上的守护进程(3)句柄的管理

写一个Windows上的守护进程(3)句柄的管理 在Windows中编程,跟HANDLE打交道是家常便饭.为了防止忘记CloseHandle,我都是使用do-while-false手法: void f() { HANDLE h = NULL; do { } while (false); if (h) { CloseHandle(h); h = NULL; } } HANDLE一多,就得写好几段长得一样的清理代码,比较麻烦.仔细一想,这个其实很容易写一个关闭器——在出作用域时自动关闭: class

C++进程检测,发现进程路径,关闭进程(二)

上一章使用的函数比较复杂,本章直接使用根据进程ID号并使用GetModuleFileNameEx函数实现进程路径的获取 #include "stdafx.h" #include <windows.h> #include "stdio.h" #include <tlhelp32.h> #include "Psapi.h" int _tmain(int argc, _TCHAR* argv[]) { int num=0; TC

写一个Windows上的守护进程(8)获取进程路径

写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路径和要守护的进程是否一致,以此来确定进程是否存在. 遍历进程大家都知道用CreateToolhelp32Snapshot系列API,但是他们最后取得的是进程exe名称,不是全路径,如果仅依靠名称就可以达到目的也就罢了,但是有的时候还是得取到全路径,这样会更靠谱一些. 那么问题来了,如何取到进程全路径