Fel*_*unz 1 c++ windows unicode winapi
我使用 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;
}
Run Code Online (Sandbox Code Playgroud)
如果我想编译它,我总是会收到错误:
错误:无法将“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);
Run Code Online (Sandbox Code Playgroud)
我仍然遇到同样的错误。您对如何解决这个问题有什么建议吗?
尝试将 CreateFile 更改为 CreateFileW。
Microsoft 有两个版本的所有涉及字符串的旧 Win32 调用,一种用于多字节字符集,另一种用于所谓的 Unicode,即 UTF-16 / UCS-2,基本上每个字符 Unicode 两个字节。如果 API 调用是 CreateFoo,则调用的两个版本将是 CreateFooA 和 CreateFooW,然后在 Windows 标头中的某处 CreateFoo 将被定义为扩展为 CreateFooA 或 CreateFooW 的宏,具体取决于是否定义了 UNICODE 预处理器定义。
如果您在 Visual Studio 中工作,则该预处理器定义的声明由 GUI 中的项目设置控制。因为您不是,所以如果您正在使用宽字符,请尝试直接调用 CreateFile 的 Unicode 版本。