我的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创建者。
如何解决此问题?谢谢!
答案 0 :(得分:13)
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
版本。答案 1 :(得分:4)
试试这个:
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或Unicode,始终都会使用ANSI字符串。
答案 2 :(得分:4)
有很多方法可以解决这个问题
请注意,在某些错误处理例程中,字符串特别是MBCS
答案 3 :(得分:2)
const char*
和const wchar_t*
是两种不同的类型,它们之间没有隐式转换。因此,您需要在将值传递给CreateFile
函数之前执行转换。请查看此答案,了解可能的转换方法:https://stackoverflow.com/a/3074785/6710751
另外,您可能只使用CreateFileA
函数代替CreateFile
,正如Ben Voigt所建议的那样。