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
相关产品推荐
相关产品推荐

