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

sci*_*guy 3 c++ qt wchar-t type-conversion char

我的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);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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);
Run Code Online (Sandbox Code Playgroud)

代码取自VS代码,我现在正在使用Qt创建者.

我该如何解决这个问题?谢谢!

dan*_*n04 14

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*参数,但是让你的函数显式地将它转换为UTF-16字符串,其函数类似于MultiByteToWideChar.
  3. 显式调用CreateFileA而不是CreateFile.
  4. 不使用编译程序UNICODE,以便宏A默认扩展到版本.
  5. 绑架一位着名的微软开发人员并强迫他阅读UTF-8无处不在,直到他同意让Windows完全支持UTF-8作为"ANSI"代码页,从而使各地的Windows开发人员摆脱这种广泛的角色.


cup*_*cup 5

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

  1. 打开项目属性,General/Character Set。这将设置为 Unicode 或多字节字符集。如果您希望使用 char*,请从 Unicode 更改为 MBCS。如果指定了 Unicode,这会将 CreateFile 转换为 CreateFileW,如果指定了 MBCS,则将转换为 CreateFileA。
  2. 将所有字符串括在 _T() 中,例如 _T("COM1")。如果指定了 MBCS,则将字符串编译为 char*,如果指定了 unicode,则编译为 wchar_t
  3. 通过前缀 L 例如 L"COM1" 强制所有字符串为宽字符串

请注意,在某些错误处理例程中,字符串特别是 MBCS