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

VS Code编译报错:无法将CHAR*转换为const wchar_t*求解决

问题原因

报错核心是类型不匹配:

  • 你使用的PROCESSENTRY32是ANSI版本结构体,它的szExeFile成员是char*类型;
  • 但调用的wcscmp是宽字符串比较函数,要求两个参数均为const wchar_t*,char*无法直接转换为const wchar_t*,因此触发编译错误。

另外代码存在逻辑错误:while循环里重复调用Process32First会一直重置遍历到第一个进程,永远无法遍历后续进程,应改为Process32Next。

解决方案

两种适配方式二选一即可:

方式一:使用宽字符版本API(推荐,适配Unicode环境)

将结构体和对应函数换成宽字符版本,与wcscmp类型保持一致:

DWORD GetPidByName(const wchar_t * pName) {
    PROCESSENTRY32W pEntry;
    HANDLE snapshot;

    pEntry.dwSize = sizeof(PROCESSENTRY32W);

    snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (Process32FirstW(snapshot, &pEntry) == TRUE) {
        do {
            if (wcscmp(pEntry.szExeFile, pName) == 0) {
                CloseHandle(snapshot); // 释放句柄避免资源泄漏
                return pEntry.th32ProcessID;
            }    
        } while (Process32NextW(snapshot, &pEntry) == TRUE);
    }
    CloseHandle(snapshot);
    return 0; // 未找到进程时返回0
}

方式二:使用ANSI版本字符串比较函数

若无需宽字符支持,将参数改为char*,用strcmp替代wcscmp:

DWORD GetPidByName(const char * pName) {
    PROCESSENTRY32 pEntry;
    HANDLE snapshot;

    pEntry.dwSize = sizeof(PROCESSENTRY32);

    snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (Process32First(snapshot, &pEntry) == TRUE) {
        do {
            if (strcmp(pEntry.szExeFile, pName) == 0) {
                CloseHandle(snapshot);
                return pEntry.th32ProcessID;
            }    
        } while (Process32Next(snapshot, &pEntry) == TRUE);
    }
    CloseHandle(snapshot);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:08:27