我正在尝试创建一个(非常)简单的Win32 GUI程序,但由于某种原因,编译器(我使用的是VC ++ 2008 Express)希望我手动将每个字符串或char *强制转换为LPCWSTR:
每次执行此操作时都会出现此编译器错误,例如我为“Hello”和“Note”收到此错误:
错误C2664:'MessageBoxW':无法将参数2从'const char [22]'转换为'LPCWSTR'
请告诉我,每次我这样做都不需要施展......
以下是代码:
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Hello", "Note", MB_OK);
return 0;
}
答案 0 :(得分:14)
VS2008中新项目的默认设置是构建支持UNICODE的应用程序。您可以更改默认设置并返回使用ANSI或MBCS应用程序(属性 - >配置属性 - >常规 - >字符集),或使用这样的Unicode字符串:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, L"Hello", L"Note", MB_OK);
return 0;
}
不将您的字符串转换为LPCWSTR,因为这会导致未定义的行为! char与wchar_t不同。
答案 1 :(得分:1)
问题是您正在为UNICODE构建并传递非Unicode字符串。
尝试:
MessageBox(NULL, L"Hello", L"Note", MB_OK);
或者为ANSI / MBCS设置你的构建或者使用TCHAR(这很痛苦)。
答案 2 :(得分:1)
我对Win32 C编程的记忆是模糊的,但我记得,你需要从这个宏中包装你的字符串文字开始:
_T( “MyString的”)
构建unicode时,会将其转换为unicode字符串。
如果你只构建unicode,或者你确定你只是在unicode中处理一个特定的字符串,你可以使用L“”标记,这就是_T宏所做的事情。
您可能需要包含tchar.h标头。
在进行win32编程时,我通常将字符串声明为TCHAR * szWhatever,因此Win9x上的东西几乎和NT / Win2k / XP一样。 (还有其他方便的宏,比如LPTSTR等等,MFC包含一些简单的转换宏,用于实际需要在ansi和unicode之间进行转换以调用特定API的情况。)
答案 3 :(得分:0)
正如其他帖子所说,您正在构建一个Unicode应用程序。您可以在项目设置中切换到Unicode项目(不要忘记为“调试”和“发布”配置设置它。
如果你想使用它,你必须在L:
之前添加所有静态字符串L"Some static string"
对于char []字符串,有一个方法mbstowcs_s,大致使用如下:
std::string str; // the string you want to convert
WCHAR wstr[128];
size_t convertedChars = sizeof(wstr)/sizeof(WCHAR);
mbstowcs_s(&convertedChars, wstr, str.c_str(), _TRUNCATE);
这是我在我的一个项目中使用它的方式。有关确切用法,请参阅MSDN。