c++ - 无法将“wchar_t”转换为“LPCSTR”
问题描述
我使用 Atom 作为我的编辑器,并且我有 g++ 编译器来编译我的 C++ 文件。
有问题的代码片段是:
bool openComPort(wchar_t* portSpecifier)
{
DCB dcb;
// Open Serial Port
wprintf(L"Opening COM PORT: %s",portSpecifier);
printf("\n");
serialPort = CreateFile(portSpecifier,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if (serialPort == INVALID_HANDLE_VALUE)
{
wprintf(L"Error opening Serial port: %s\n",portSpecifier);
return(false);
}
...
return true;
}
如果我想编译它,我总是会得到错误:
错误:无法将 'wchar_t' 转换为 'LPCSTR' {aka 'const char'} serialPort = CreateFile(portSpecifier,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
我读过它应该与 Windows 和 UNICODE 或 ASCII 有关。
我通过按 ctrl+shift+U 并选择 UTF-8 确保 Atom 使用 UNICODE。
我一开始就尝试过#define UNICODE
。没用。
我尝试了与其他线程不同的解决方案,例如:
(_TCHAR*)wprintf(L"Opening COM PORT: %s",portSpecifier);
仍然我总是得到同样的错误。你对如何解决这个问题有什么建议吗?
解决方案
尝试将 CreateFile 更改为 CreateFileW。
Microsoft 有两个涉及字符串的旧 Win32 调用版本,一个用于多字节字符集,另一个用于它所称的 Unicode,即 UTF-16 / UCS-2,基本上每个字符 Unicode 两个字节。如果 API 调用是 CreateFoo,则调用的两个版本将是 CreateFooA 和 CreateFooW,然后在 Windows 标头中某处 CreateFoo 将被定义为一个宏,该宏扩展为 CreateFooA 或 CreateFooW,具体取决于是否定义了 UNICODE 预处理器定义。
如果您在 Visual Studio 中工作,则该预处理器定义的声明由 GUI 中的项目设置控制。既然您不是,请尝试在使用宽字符时直接调用 Unicode 版本的 CreateFile。
推荐阅读
- cordova - 如何为 IOS 和 Android 构建启动画面
- python - 如何在 python 中使用正则表达式来删除 Unicode 字符?
- c++ - 为什么我的 if 函数没有从字符串中删除空格?它不能检测 c++ 中的空格输入吗?有没有办法从输入中删除空间
- acumatica - Acumatica 自定义字段值在屏幕上更新,但不在数据库中
- design-patterns - BOM - 最佳命名
- javascript - 用于获取 FieldValue 的 firebase 与 Firebase 有什么区别
- r - 将多个数据框导出到多个 Excel 工作表
- angular - 角路由打开错误的组件
- python - 多维输出的 Softmax 和损失函数
- git - `git log --pretty=format` 可以通过正则表达式转换输出吗?