我的 C++ 代码中出现了一个我无法理解的错误。剥离的代码位在这里:
RS232Handle=OpenRS232("COM1", 9600);
HANDLE OpenRS232(const char* ComName, DWORD BaudRate)
{
ComHandle=CreateFile(ComName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}
我收到以下错误:
error: cannot convert 'const char*' to 'LPCWSTR {aka const wchar_t*}' for argument '1' to 'void* CreateFileW(LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE)'
ComHandle=CreateFile(ComName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
代码取自 VS 代码,我现在正在使用 Qt creator。
我该如何解决这个问题?谢谢!
原文由 sci-guy 发布,翻译遵循 CC BY-SA 4.0 许可协议
Windows CreateFile 函数实际上是一个宏,它扩展为以下之一:
CreateFileA
,它采用const char*
类型的文件路径CreateFileW
,它采用const wchar_t*
类型的文件路径。(Windows API 中大多数采用字符串的函数也是如此。)
您正在声明参数
const char* ComName
,但显然编译时定义了UNICODE
,因此它调用了W
版本的函数。从const wchar_t*
到const char*
没有自动转换,因此出现错误。您的选择是:
const wchar_t*
) 字符串。char*
参数,但让您的函数使用 MultiByteToWideChar 之类的函数将其显式转换为 UTF-16 字符串。CreateFileA
而不是CreateFile
。UNICODE
的情况下编译您的程序,以便宏默认扩展为A
版本。编辑: 我不知道是否涉及绑架,但 Windows 10 1903 最终添加 了对 UTF-8 作为 ANSI 代码页的 支持。