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

使用WTSEnumerateProcesses获取进程时遇编译链接错误求助(GCC环境)

使用WTSEnumerateProcesses获取进程时的编译错误解决

问题描述

尝试用WTSEnumerateProcesses()获取本地所有进程,代码如下:

#include <iostream>
#include <Windows.h>
#include <WtsApi32.h>
#include <sddl.h>
 
#pragma comment(lib, "Wtsapi32.lib")

using namespace std;

int main() {
    cout << "C++ DLL Injector";
    WTS_PROCESS_INFO *processes = NULL;
    LPTSTR sid;
    DWORD count = 0;
 
    if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &processes, &count)) {
        for (DWORD i = 0; i < count; i++) {
            if (!ConvertSidToStringSid(processes[i].pUserSid, &sid)) {
                std::wcout <<
                    processes[i].pProcessName <<
                    " " <<
                    processes[i].ProcessId <<
                    " " <<
                    processes[i].SessionId <<
                    " " <<
                    std::endl;
            } else {
                std::wcout <<
                    processes[i].pProcessName <<
                    " " <<
                    processes[i].ProcessId <<
                    " " <<
                    processes[i].SessionId <<
                    " " <<
                    sid <<
                    " " <<
                    std::endl;
            }
        }
    } else {
        return GetLastError();
    }
 
    WTSFreeMemory(processes);
 
    return NO_ERROR;
}

使用GCC/G++编译时出现以下错误:

C:\msys64\mingw64\bin\g++.exe -fdiagnostics-color=always -g C:\Users\gabri\Downloads\Code\C++\Main.cpp -o C:\Users\gabri\Downloads\Code\C++\Main.exe
C:\Users\gabri\Downloads\Code\C++\Main.cpp: In function 'int main()':
C:\Users\gabri\Downloads\Code\C++\Main.cpp:16:58: warning: passing NULL to non-pointer argument 2 of 'WINBOOL WTSEnumerateProcessesA(HANDLE, DWORD, DWORD, _WTS_PROCESS_INFOA**, DWORD*)' [-Wconversion-null]
   16 |     if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &processes, &count)) {
      |                                                          ^~~~
In file included from C:\Users\gabri\Downloads\Code\C++\Main.cpp:3:
C:/msys64/mingw64/include/WtsApi32.h:168:62: note:   declared here
  168 |   WINBOOL WINAPI WTSEnumerateProcessesA(HANDLE hServer,DWORD Reserved,DWORD Version,PWTS_PROCESS_INFOA *ppProcessInfo,DWORD *pCount);
      |                                                        ~~~~~~^~~~~~~~
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\gabri\AppData\Local\Temp\ccZGWcxq.o: in function `main':
C:\Users\gabri\Downloads\Code\C++/Main.cpp:16: undefined reference to `WTSEnumerateProcessesA'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\gabri\Downloads\Code\C++/Main.cpp:44: undefined reference to `WTSFreeMemory'
collect2.exe: error: ld returned 1 exit status

错误原因及修复方法

1. 链接错误:未找到Wtsapi32库函数

#pragma comment(lib, "Wtsapi32.lib")是MSVC编译器特有的指令,GCC/G++不支持该语法。必须在编译命令中手动指定链接库。

修复方法:编译时添加-lwtsapi32参数,修改后的编译命令为:

g++ -g Main.cpp -o Main.exe -lwtsapi32

2. 类型不匹配警告:NULL传递给DWORD参数

WTSEnumerateProcesses的第二个参数Reserved是DWORD类型(无符号整数),但代码中传递了NULL(指针类型)。虽然Windows中NULL被定义为0,但GCC会触发类型不匹配警告。

修复方法:将NULL替换为0,修改后的函数调用代码:

if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &processes, &count)) {

3. 潜在内存泄漏问题

调用ConvertSidToStringSid成功后,返回的sid内存需要手动释放,否则会造成内存泄漏。

修复方法:在else分支的输出语句后添加内存释放代码:

LocalFree(sid);

修复后的完整代码

#include <iostream>
#include <Windows.h>
#include <WtsApi32.h>
#include <sddl.h>

using namespace std;

int main() {
    wcout << L"C++ DLL Injector" << endl;
    WTS_PROCESS_INFO *processes = NULL;
    LPTSTR sid = nullptr;
    DWORD count = 0;
 
    if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, &processes, &count)) {
        for (DWORD i = 0; i < count; i++) {
            if (!ConvertSidToStringSid(processes[i].pUserSid, &sid)) {
                std::wcout <<
                    processes[i].pProcessName <<
                    L" " <<
                    processes[i].ProcessId <<
                    L" " <<
                    processes[i].SessionId <<
                    std::endl;
            } else {
                std::wcout <<
                    processes[i].pProcessName <<
                    L" " <<
                    processes[i].ProcessId <<
                    L" " <<
                    processes[i].SessionId <<
                    L" " <<
                    sid <<
                    std::endl;
                LocalFree(sid); // 释放SID字符串内存
                sid = nullptr;
            }
        }
        WTSFreeMemory(processes);
    } else {
        wcout << L"Error: " << GetLastError() << endl;
        return GetLastError();
    }
 
    return NO_ERROR;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:07:20