无法将 'const char\*' 转换为 'LPCWSTR {aka const 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 creator。

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

原文由 sci-guy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

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. 绑架一位著名的 Microsoft 开发人员并强迫他阅读 UTF-8 Everywhere ,直到他同意让 Windows 完全支持 UTF-8 作为“ANSI”代码页,从而将各地的 Windows 开发人员从这种宽字符的东西中解放出来。

编辑: 我不知道是否涉及绑架,但 Windows 10 1903 最终添加 了对 UTF-8 作为 ANSI 代码页的 支持。

原文由 dan04 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试这个:

 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 字符串。

原文由 Govind Parmar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题