You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何终止路径含指定文件夹的进程并获取其进程句柄?

我来帮你搞定这个需求——不管是找出路径包含特定文件夹的进程、拿到它们的句柄,还是批量终止这些进程,都可以通过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类型):进程ID
  • ProcessHandle(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消息(需要额外声明SendMessage API),但这种方式不保证所有进程都会响应。
  • 路径匹配:建议统一将路径转成小写后再判断,避免大小写导致的匹配失败。

内容的提问来源于stack exchange,提问作者user7022367

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:21:44