VS编译错误E0167:const char*与LPCWSTR参数类型不兼容求助
解决CreateFile调用的LPCWSTR类型不兼容错误
问题场景
以下枚举串口的C++代码中,调用CreateFile(port.c_str())时出现编译错误E0167,提示“const char *类型的实参与LPCWSTR类型的形参不兼容”:
#include <Windows.h> #include <iostream> #include <vector> #include <string> std::vector<std::string> serialCOM::list_serial_ports() { std::vector<std::string> ports; // Enumerate all available COM ports for (int i = 1; i <= 256; i++) { std::string port = "COM" + std::to_string(i); HANDLE hComm = CreateFile(port.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); } return ports; }
错误原因
Windows SDK默认启用Unicode字符集,此时CreateFile是CreateFileW的宏定义,要求传入宽字符串类型(LPCWSTR即const wchar_t*),但代码中std::string::c_str()返回的是窄字符串(const char*),类型不匹配导致编译错误。
三种解决方法
方法1:改用宽字符串类型
将代码中的std::string替换为std::wstring,对应字符串字面量加L前缀,数字转字符串使用std::to_wstring:
#include <Windows.h> #include <iostream> #include <vector> #include <string> std::vector<std::wstring> serialCOM::list_serial_ports() { std::vector<std::wstring> ports; for (int i = 1; i <= 256; i++) { std::wstring port = L"COM" + std::to_wstring(i); HANDLE hComm = CreateFile(port.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); // 可添加判断逻辑,将有效串口加入结果列表 if (hComm != INVALID_HANDLE_VALUE) { ports.push_back(port); CloseHandle(hComm); } } return ports; }
方法2:直接调用ANSI版本的CreateFileA
显式调用CreateFileA(ANSI版本),无需修改字符串类型:
#include <Windows.h> #include <iostream> #include <vector> #include <string> std::vector<std::string> serialCOM::list_serial_ports() { std::vector<std::string> ports; for (int i = 1; i <= 256; i++) { std::string port = "COM" + std::to_string(i); HANDLE hComm = CreateFileA(port.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); // 可添加判断逻辑,将有效串口加入结果列表 if (hComm != INVALID_HANDLE_VALUE) { ports.push_back(port); CloseHandle(hComm); } } return ports; }
方法3:修改项目字符集设置
在Visual Studio中操作:
- 右键项目 → 属性 → 配置属性 → 常规 → 字符集
- 将“使用Unicode字符集”改为“使用多字节字符集”
此时CreateFile会映射为CreateFileA,直接支持窄字符串,原代码无需修改。
内容的提问来源于stack exchange,提问作者Growth
相关产品推荐
相关产品推荐

