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

问题描述 投票:1回答:4

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

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

c++ qt char type-conversion wchar-t
4个回答
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开发人员摆脱这种广泛的角色。

4
投票

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

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

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


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字符串,无论您是在项目中使用ANSI还是Unicode。


2
投票

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

另外,你可能只使用CreateFileA函数而不是CreateFile,正如Ben Voigt所建议的那样。

© www.soinside.com 2019 - 2024. All rights reserved.