c++ - 无法将 'wchar_t' 转换为 'LPCSTR'

标签 c++ windows winapi unicode

<分区>

我使用 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;
}

如果我想编译它,我总是得到错误:

error: cannot convert 'wchar_t' to '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 header 的某处,CreateFoo 将被定义为一个宏,该宏根据是否定义了 UNICODE 预处理器定义而扩展为 CreateFooA 或 CreateFooW。

如果您在 Visual Studio 中工作,则该预处理器定义的声明由 GUI 中的项目设置控制。由于您不是,如果您使用的是宽字符,请尝试直接调用 CreateFile 的 Unicode 版本。

关于c++ - 无法将 'wchar_t' 转换为 'LPCSTR',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58885390/

相关文章:

c++ - 如何避免关于未初始化变量的 clang-tidy 警告

windows - 使用 iscsicli.exe 和 powershell 删除最喜欢的目标并断开 iSCSI 目标

windows - 如何在 Windows 中禁用 Jenkins 自动运行

c++ - 在 Windows 上使用多线程文件 IO 的 SHARING_VIOLATION

delphi - 如何使用系统对话框图标加载图像列表

c++ - std::vector<T> 的比较运算符找不到 T 的比较运算符

c++ - 在 C++ 中将指针传递给类

c++ - 错误 : missing template arguments before 'words'

winapi - RegDeleteKey值和RegDeleteValue有什么区别?

C++ 如何检测 Windows Server 2019?