【问题标题】:Qstring to LPCWSTRQstring 到 LPCWSTR
【发布时间】:2013-12-24 14:36:14
【问题描述】:
LPCWSTR path;

void WinApiLibrary::StartProcess(QString name)
{
    path = name.utf16();
    CreateProcess(path, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}

C:\kursovaya\smc\winapilibrary.cpp:21: 错误:从无效转换 'const ushort* {aka const short unsigned int*}' 到 'LPCWSTR {aka const wchar_t*}' [-fpermissive] path = name.utf16();

这段代码在 Qt 4.8 中工作,但现在我有 Qt 5.2 并且这段代码不工作。这家伙怎么了?

【问题讨论】:

  • 对 LPCWSTR 进行额外的转换。
  • 有点吹毛求疵:如果您使用的是 Qt,为什么还要打扰 CreateProcess?只需使用QProcess

标签: qt


【解决方案1】:

我遇到了同样的问题(我使用的是 Qt 5.3),这就是我修复它的方法:

QString strVariable1;
LPCWSTR strVariable2 = (const wchar_t*) strVariable1.utf16();

【讨论】:

    【解决方案2】:

    QString::utf16()返回const ushort*,这与const wchar_t*不同,所以你有编译错误。

    您可能正在使用/Zc:wchar_t 进行编译。如果将其更改为/Zc:wchar_t-,它应该可以工作,因为在这种情况下,wchar_t 类型将 typedef 变为 16 位整数。

    在Visual Studio中:Project Properties->Configuration Properties->C/C++->Treat WChar_t As Built in Type->No.

    或者只是添加reinterpret_cast<LPCWSTR>

    【讨论】:

    • 好的,谢谢。但是我在 QtCreator 哪里可以找到它?
    • 好的,我想我明白这个问题了。您正在使用 MinGW 构建,这就是错误的原因。此外,QMAKE_CXX_FLAGS += /Zc:wchar_t- 也无济于事,因为这是 Microsoft Visual C++ 编译器开关,g++ 无法理解。我认为reinterpret_cast 将是这种情况下唯一的解决方案。
    • 我认为我们以后应该在 QString 中添加一个 toWCharArray。我看到很多人在做这些令人讨厌的重新解释演员表。 :-)
    • @LaszloPapp 已经有toStdWString(),但它在Windows和其他平台上以不同的编码返回字符串。
    • @Paul: 扩展为 std::wstring 而不是 wchar_t,所以我想我会问 qt 开发人员是否有必要在 5.3 中添加这样的功能。
    【解决方案3】:

    我正在使用Qt 5.2,我遇到了同样的问题。这就是我修复它的方法:

    QString sPath = "C:\\Program File\\MyProg";
    wchar_t wcPath[1024];
    int iLen = sPath.toWCharArray(wcPath);
    

    【讨论】:

      【解决方案4】:

      在 Qt 全局命名空间中,有宏 qUtf16Printable。但是,正如文档所述,这会产生一个临时的,因此请注意正确使用它。请注意,这是在 Qt5.7 中引入的。

      【讨论】:

        猜你喜欢
        • 2010-10-14
        • 2010-11-06
        • 2013-03-22
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 1970-01-01
        • 2017-02-05
        相关资源
        最近更新 更多