如何正确使用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
相关产品推荐
相关产品推荐

