如何终止路径含指定文件夹的进程并获取其进程句柄?
我来帮你搞定这个需求——不管是找出路径包含特定文件夹的进程、拿到它们的句柄,还是批量终止这些进程,都可以通过Windows API结合PowerBuilder来实现,下面一步步给你讲清楚:
一、获取路径含指定文件夹的进程及句柄
PowerBuilder本身没有直接枚举进程的函数,所以我们需要调用Windows系统的API来实现。核心思路是:先枚举所有进程ID,再逐个打开进程获取句柄,最后读取进程的可执行文件路径并筛选。
第一步:声明所需的Windows API函数
在PowerBuilder的全局函数或者自定义对象中,先声明这些API:
// 枚举系统内所有进程ID Function Boolean EnumProcesses(ref ulong lpidProcesses[], ulong cb, ref ulong cbNeeded) Library "psapi.dll" // 打开进程并获取句柄 Function ulong OpenProcess(ulong dwDesiredAccess, Boolean bInheritHandle, ulong dwProcessId) Library "kernel32.dll" // 获取进程的可执行文件路径 Function Boolean GetModuleFileNameExA(ulong hProcess, ulong hModule, ref string lpFilename, ulong nSize) Library "psapi.dll" // 关闭进程句柄(避免资源泄漏) Function Boolean CloseHandle(ulong hObject) Library "kernel32.dll" // 定义所需常量 Constant ulong PROCESS_QUERY_INFORMATION = 1024 Constant ulong PROCESS_VM_READ = 16 Constant ulong MAX_PATH = 260
第二步:创建进程信息结构
先新建一个自定义结构(比如命名为nvo_process_info),用来存储筛选后的进程数据:
ProcessId(ulong类型):进程IDProcessHandle(ulong类型):进程句柄ProcessPath(string类型):进程的完整路径
第三步:编写筛选进程的自定义函数
写一个函数来枚举并筛选符合路径条件的进程:
Function of_GetTargetProcesses(string as_TargetFolder, ref nvo_process_info astr_Processes[]) returns integer ulong lul_ProcessIds[1024] ulong lul_BytesReturned ulong lul_ProcessId ulong lh_Process string ls_Path integer li_Count = 0 integer i // 第一步:枚举所有进程ID if not EnumProcesses(lul_ProcessIds, 1024 * 4, lul_BytesReturned) then return -1 // 枚举失败返回-1 end if // 第二步:遍历每个进程ID,获取路径并筛选 for i = 1 to lul_BytesReturned / 4 lul_ProcessId = lul_ProcessIds[i] // 打开进程,获取具备查询权限的句柄 lh_Process = OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, False, lul_ProcessId) if lh_Process > 0 then ls_Path = Space(MAX_PATH) // 获取进程的完整路径 if GetModuleFileNameExA(lh_Process, 0, ls_Path, MAX_PATH) then ls_Path = Trim(ls_Path) // 检查路径是否包含目标文件夹(不区分大小写) if Pos(Lower(ls_Path), Lower(as_TargetFolder)) > 0 then li_Count ++ astr_Processes[li_Count].ProcessId = lul_ProcessId astr_Processes[li_Count].ProcessHandle = lh_Process astr_Processes[li_Count].ProcessPath = ls_Path else // 不符合条件,及时关闭句柄释放资源 CloseHandle(lh_Process) end if else CloseHandle(lh_Process) end if end if next return li_Count // 返回符合条件的进程数量 End Function
二、终止符合条件的进程
拿到进程句柄后,我们可以用TerminateProcess API强制终止进程,同样需要先声明这个函数:
Function Boolean TerminateProcess(ulong hProcess, uint uExitCode) Library "kernel32.dll"
调用示例
在你的PowerBuilder代码中,这样调用就能批量终止目标进程:
string ls_TargetFolder = "C:\YourApp\ChildProcesses\" // 替换成你的目标文件夹路径 nvo_process_info lstr_Processes[] integer li_Count integer i // 先获取符合条件的进程 li_Count = of_GetTargetProcesses(ls_TargetFolder, lstr_Processes) if li_Count > 0 then for i = 1 to li_Count // 强制终止进程(退出码设为0) TerminateProcess(lstr_Processes[i].ProcessHandle, 0) // 关闭句柄释放资源 CloseHandle(lstr_Processes[i].ProcessHandle) next MessageBox("提示", "已成功终止" + string(li_Count) + "个目标进程") else MessageBox("提示", "未找到任何路径包含指定文件夹的进程") end if
注意事项
- 权限问题:你的PowerBuilder程序需要以管理员权限运行,否则可能无法打开或终止系统级进程。
- 优雅关闭vs强制终止:
TerminateProcess是强制终止,可能导致进程数据丢失。如果需要优雅关闭,可以尝试给进程发送WM_CLOSE消息(需要额外声明SendMessageAPI),但这种方式不保证所有进程都会响应。 - 路径匹配:建议统一将路径转成小写后再判断,避免大小写导致的匹配失败。
内容的提问来源于stack exchange,提问作者user7022367
相关产品推荐
相关产品推荐

