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

如何正确使用WTSEnumerateProcessesExW API?参数错误问题排查

解决WTSEnumerateProcessesExW调用返回“参数不正确”的问题

你的代码存在两个关键问题,直接导致了参数错误:

1. 第四个参数的类型强制转换错误

WTSEnumerateProcessesExW的第四个参数要求是指向WTS_PROCESS_INFOW*的指针,但你错误地将其强制转换为(LPWSTR*),类型不匹配触发了参数错误。

正确做法是直接传递&pProcessInfo,因为pProcessInfo本身就是WTS_PROCESS_INFOW*类型,它的地址完全符合函数参数要求,不需要额外强制转换(若要写转换,也应该用reinterpret_cast<LPWSTR*>而非直接转LPWSTR*)。

2. 动态加载库但未正确使用函数指针(冗余且易出问题)

你用LoadLibrary加载了wtsapi32.dll,但代码里直接调用WTSEnumerateProcessesExW——这实际是依赖#pragma comment(lib, "WtsApi32.lib")做的静态链接,LoadLibrary的调用完全冗余。如果要动态调用,必须通过GetProcAddress获取函数指针后再调用,否则会出现逻辑混乱。

修正后的基础代码示例

#include <WtsApi32.h>
#include <stdexcept>
#include <windows.h>

#pragma comment(lib, "WtsApi32.lib")

int main()
{
    WTS_PROCESS_INFOW* pProcessInfo = nullptr;
    DWORD dwProcessCount = 0;

    if (!WTSEnumerateProcessesExW(
        WTS_CURRENT_SERVER_HANDLE,
        0,
        WTS_CURRENT_SESSION,
        reinterpret_cast<LPWSTR*>(&pProcessInfo),
        &dwProcessCount
    )) {
        DWORD err = GetLastError();
        throw std::runtime_error("WTSEnumerateProcessesExW failed");
    }

    // 使用完进程信息后必须释放内存,避免泄漏
    if (pProcessInfo != nullptr) {
        WTSFreeMemoryExW(WTSTypeProcessInfoLevel0, pProcessInfo, dwProcessCount);
    }

    return 0;
}

动态加载的正确写法(如需兼容旧系统)

#include <WtsApi32.h>
#include <stdexcept>
#include <windows.h>

// 定义函数指针类型
typedef BOOL(WINAPI* pWTSEnumerateProcessesExW)(
    HANDLE hServer,
    DWORD* pLevel,
    DWORD SessionId,
    LPWSTR* ppProcessInfo,
    DWORD* pCount
);

int main()
{
    WTS_PROCESS_INFOW* pProcessInfo = nullptr;
    DWORD dwProcessCount = 0;

    HMODULE hWTSAPI = LoadLibrary(TEXT("wtsapi32.dll"));
    if (!hWTSAPI) {
        throw std::runtime_error("LoadLibrary failed");
    }

    pWTSEnumerateProcessesExW fnWTSEnumerateProcessesExW = 
        reinterpret_cast<pWTSEnumerateProcessesExW>(GetProcAddress(hWTSAPI, "WTSEnumerateProcessesExW"));

    if (!fnWTSEnumerateProcessesExW) {
        FreeLibrary(hWTSAPI);
        throw std::runtime_error("GetProcAddress failed");
    }

    if (!fnWTSEnumerateProcessesExW(
        WTS_CURRENT_SERVER_HANDLE,
        0,
        WTS_CURRENT_SESSION,
        reinterpret_cast<LPWSTR*>(&pProcessInfo),
        &dwProcessCount
    )) {
        DWORD err = GetLastError();
        FreeLibrary(hWTSAPI);
        throw std::runtime_error("WTSEnumerateProcessesExW failed");
    }

    // 释放资源
    if (pProcessInfo != nullptr) {
        WTSFreeMemoryExW(WTSTypeProcessInfoLevel0, pProcessInfo, dwProcessCount);
    }
    FreeLibrary(hWTSAPI);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:05:30