【问题标题】:cannot convert cont char* to LPCWSTR无法将 const char* 转换为 LPCWSTR
【发布时间】:2014-09-24 04:40:12
【问题描述】:

我在 QT 编译器中遇到了一个错误,但是它在 VS2010 上运行良好。该错误指出 我看过其他与相同错误相关的帖子,但没有解决我在 QT 中的问题。我试过 _T,L 或 TEXT 但还是不行

bq。错误:C2664:'句柄 LoadImageW(HINSTANCE,LPCWSTR,UINT,int,int,UINT)' : 无法转换 参数 2 从 'const char *' 到 'LPCWSTR' 指向的类型是 无关;转换需要 reinterpret_cast、C-style cast 或 函数式转换

我的代码如下

Bitmap::Bitmap(std::string const& file_name) {
bitmap_ = static_cast<HBITMAP>(::LoadImage(0, file_name.c_str(), IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION));
}

如果您有解决此问题的任何想法,请分享

【问题讨论】:

  • 你编译时定义了 UNICODE 宏,如果你真的相信你可以不用 UNICODE 就可以关闭它:)

标签: qt char lpcwstr


【解决方案1】:

Qt 不包含编译器。在 Windows 上,您可能正在使用 mingw 或 Visual C++ 进行编译。无论哪种方式,问题是您正在调用一个需要宽字符串的函数,但您却试图将其传递给一个 8 位字符串。

出于兼容性原因,Win32 uses a different set of API functions if you have _UNICODE defined。在您的情况下,您确实定义了 _UNICODE。您可以继续使用 8 位 std::string,但只需将方法从 LoadImage() to LoadImageA() 更改。或者,如果您不介意更改 Bitmap 类,您可以从 std::string 切换到 std::wstring 以利用 Windows 的 Unicode 功能。

但也许更大的问题是,如果您使用 Qt,为什么要使用 Win32 来加载位图和 std::string? Qt 的QImage classQString class 提供了功能齐全的跨平台字符串和图像加载器。像任何综合框架一样,如果您只根据需要使用外部功能,Qt 效果最好。

【讨论】:

    【解决方案2】:

    我不确定这种方法是否最好,但我已经在我的项目中使用它们并且效果很好,请参阅:

    char *source = "Hello world";
    WCHAR target[size];
    MultiByteToWideChar(CP_ACP, 0, source, -1, target, size);
    LPCWSTR final = target;
    
    MessageBox(0, final, TEXT("title"), 0); //Sample usage
    

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 2017-10-14
      • 2016-07-06
      • 2011-07-25
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多