:错误C2664:'MessageBoxW':无法从'const char [40]'转换参数2

时间:2010-02-22 17:37:58

标签: c++ c visual-studio visual-studio-2008

我正在读一本书,它告诉我打开一个空的WIN32项目。我创建了名为main.cpp的源文件并将其放在源文件夹中(这是我项目中唯一的文件)。在该文件中输入以下代码:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine, int nShowCmd)
{
    MessageBox(NULL, "Motoko kusangai has hacked your system!", "Public Security Section 9", MB_OK | MB_ICONEXCLAMATION);
}

然后运行它。但是我收到以下错误:

1>c:\users\numerical25\documents\visual studio 2008\projects\begin\begin\main.cpp(6) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [40]' to 'LPCWSTR'
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>Build log was saved at "file://c:\Users\numerical25\Documents\Visual Studio 2008\Projects\Begin\Begin\Debug\BuildLog.htm"
1>Begin - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我做错了什么?

4 个答案:

答案 0 :(得分:9)

在这种情况下,您需要使用宽字符串,因为您正在编译unicode。尝试使用L.

为所有字符串常量添加前缀
MessageBox(
  NULL, 
  L"Motoko kusangai has hacked your system!", 
  L"Public Security Section 9", 
  MB_OK | MB_ICONEXCLAMATION);

答案 1 :(得分:4)

Petzold的经典编程Windows开始于我推荐阅读的关于Unicode的伟大章节。如果您要进行任何Win32 UI工作,我会得到他的书的副本。鉴于Win32如今不受欢迎,您可以以不到20美元的价格购买最新第5版的旧版本。与大多数技术作家不同,查尔斯有一种非常对话的风格,并且使用强大的故事讲述技巧使他的书尽管长度很长(他的编程Windows与C#同样好)。

这些天使用unicode字符串是很好的做法但如果你真的不想要它们,你可以进入VS中的项目属性并将字符集更改为“使用Multi-字节字符集“,它基本上可以获得您可能习惯的常规8位ASCII。

答案 2 :(得分:2)

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine, int nShowCmd)
{
    MessageBox(NULL, _T("Motoko kusangai has hacked your system!"), _T("Public Security Section 9"), MB_OK | MB_ICONEXCLAMATION);
}

每次针对某些静态文本出现此错误时,请将静态文本括在_T()标记内。

修改:MS Link

答案 3 :(得分:0)

我有类似的错误并改为&#34;使用多字节字符集&#34;为我工作。我正在使用Visual Studio 2012。