投射到LPCWSTR?

时间:2009-03-20 19:27:42

标签: c windows winapi unicode

我正在尝试创建一个(非常)简单的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;
}

4 个答案:

答案 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