【问题标题】:Cannot convert parameter from 'const char[20]' to 'LPCWSTR'无法将参数从“const char [20]”转换为“LPCWSTR”
【发布时间】:2011-07-25 18:43:56
【问题描述】:

编译这段代码时:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInsance,HINSTANCE hPrevInstance,PSTR cmdLine,int showCmd){
    MessageBox(0,"First Win32 Program","Window Tittle",MB_OK);
    }

我得到编译器错误:

错误 C2664: 'MessageBoxW': 无法将参数 2 从 'const char [20]' 转换为 'LPCWSTR' 1> 指向的类型不相关;转换需要 reinterpret_cast、C-style cast 或 function-style cast

我做错了什么?

【问题讨论】:

标签: c++ winapi visual-c++-2010


【解决方案1】:

您已定义 UNICODE,因此 MessageBox 需要一个宽字符串。

【讨论】:

    【解决方案2】:

    默认情况下,UNICODE 在 Visual Studio 2010 中定义。调用 MessageBoxA 而不是使用 MessageBox 定义或传递宽字符串文字(L"First Win32 Program" 和 L"Window Title") 或者,如果您真的关心能够在没有定义 UNICODE 的情况下进行构建,请在字符串文字周围使用 _T 宏:_T("First Win32 Program")(这是与L定义UNICODE时为“First Win32 Program”相同,但未定义UNICODE时为“First Win32 Program”)。

    有关UNICODE 及其如何影响调用的API 的更多信息,请参阅此链接:http://msdn.microsoft.com/en-us/goglobal/bb688113.aspx。具体来说,“创建 Win32 Unicode 应用程序”下面的部分。

    附带说明:Microsoft 目前支持的所有 Windows 操作系统都是 Unicode 原生的。我建议始终支持“宽”API。在这种情况下,MessageBoxW,这是在设置UNICODE 时定义的MessageBox。使用 _T 宏和不定义 UNICODE 进行编译的日子应该已经过去了。

    【讨论】:

    • 嗯,我总是使用_T 宏。我不确定缺点是什么,或者您为什么更喜欢使用 L,即使非 Unicode 时代已经过去。
    • 没有真正的缺点,除了有些人可能会觉得杂乱无章,而且如果您忘记使用它,在定义 UNICODE 时会出现编译错误,反之亦然。就个人而言,我选择调用宽 API 并仅使用宽数据类型的显式性,这实际上使 UNICODE 定义无用。
    • @Cody - 使用 L 而不是 _T 的一个原因是 L 是标准 C++,而且我们只针对定义了 UNICODE 的 Windows 版本。当然,除非你仍然做很多 Windows 95。 :-)
    【解决方案3】:

    MessageboxW 需要宽字符...您可以对您的代码进行一些小改动,这样您的代码就会完美运行。 解决方案一:- MessageBox(0,L"First Win32 Program",L"Window Title",MB_OK); 解决方案二。使用 MessageboxA 而不是 Messagebox。 MessageboxA 将采用 ANCI 字符集中的字符。

    【讨论】:

    • 这是我的解决方案
    猜你喜欢
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2017-03-31
    • 2021-03-01
    • 2020-04-04
    • 2011-07-25
    相关资源
    最近更新 更多