无法将'const char *'转换为'LPCWSTR {aka const wchar_t *}'

时间:2016-11-16 20:20:33

标签: c++ qt char type-conversion wchar-t

我的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创建者。

如何解决此问题?谢谢!

4 个答案:

答案 0 :(得分:13)

Windows CreateFile函数实际上是一个扩展为以下之一的宏:

  • CreateFileA,它采用const char*
  • 类型的文件路径
  • CreateFileW,它采用const wchar_t*类型的文件路径。

(对于采用字符串的Windows API中的大多数函数也是如此。)

您已声明参数const char* ComName,但显然已定义为UNICODE,因此它正在调用该函数的W版本。没有从const wchar_t*const char*的自动转换,因此错误。

您的选择是:

  1. 将函数参数更改为UTF-16(const wchar_t*)字符串。
  2. 保留char*参数,但让您的函数显式将其转换为带有MultiByteToWideChar函数的UTF-16字符串。
  3. 明确致电CreateFileA而非CreateFile
  4. 在没有UNICODE的情况下编译您的程序,以便默认情况下宏扩展为A版本。
  5. 绑架一位着名的微软开发人员并迫使他阅读UTF-8 Everywhere,直到他同意让Windows完全支持UTF-8作为“ANSI”代码页,从而将Windows开发人员从这些广泛的角色中解放出来。 / LI>

答案 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函数都有WA版本;我所知道的唯一例外是函数GetProcAddress,无论您是否在项目中使用ANSI或Unicode,始终都会使用ANSI字符串。

答案 2 :(得分:4)

有很多方法可以解决这个问题

  1. 打开项目属性,常规/字符集。这将设置为Unicode或多字节字符集。如果您希望使用char *从Unicode更改为MBCS。如果指定了Unicode,这将把CreateFile转换为CreateFileW,如果指定了MBCS,则将CreateFileA转换为。
  2. 将_T()中的所有字符串括起来,例如_T(“COM1”)。如果指定了MBCS,则将字符串编译为char *,如果指定了unicode,则将其编译为wchar_t
  3. 强制所有字符串为宽字符串,前缀为L,例如L“COM1”
  4. 请注意,在某些错误处理例程中,字符串特别是MBCS

答案 3 :(得分:2)

const char*const wchar_t*是两种不同的类型,它们之间没有隐式转换。因此,您需要在将值传递给CreateFile函数之前执行转换。请查看此答案,了解可能的转换方法:https://stackoverflow.com/a/3074785/6710751

另外,您可能只使用CreateFileA函数代替CreateFile,正如Ben Voigt所建议的那样。