我的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创建者。
我该如何解决这个问题?谢谢!
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
版本。有很多方法可以解决这个问题
请注意,在某些错误处理例程中,字符串特别是MBCS
试试这个:
RS232Handle=OpenRS232(L"COM1", 9600);
HANDLE OpenRS232(const wchar_t* ComName, DWORD BaudRate)
{
ComHandle=CreateFileW(ComName, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
}
在Windows上,wchar_t类型用于表示UTF-16编码的字符。这是Windows内核在内部使用的内容,因此Visual C ++的现代版本默认使用Unicode函数。如果您坚持使用ANSI函数(因此返回原始代码),请从字符串“COM1”中删除L
前缀,并将调用从CreateFileW
更改为CreateFileA
。
大多数处理字符串的Windows API函数都有W
和A
版本;我所知道的唯一例外是函数GetProcAddress
,它总是采用ANSI字符串,无论您是在项目中使用ANSI还是Unicode。
const char*
和const wchar_t*
是两种不同的类型,它们之间没有隐式转换。因此,您需要在将值传递给CreateFile
函数之前执行转换。看看这个答案可能的转换方法:https://stackoverflow.com/a/3074785/6710751
另外,你可能只使用CreateFileA
函数而不是CreateFile
,正如Ben Voigt所建议的那样。