English 中文(简体)
转换为 LPCWSTR?
原标题:
  • 时间:2009-03-20 19:27:42
  •  标签:

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

在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!

问题回答

问题在于您正在为UNICODE构建,但传递的是非Unicode字符串。

尝试:

MessageBox(NULL, L"Hello", L"Note", MB_OK);

或者为ANSI/MBCS设置您的构建,或者考虑使用TCHARs(这很麻烦)。

我对Win32 C编程的记忆有些模糊,但我记得,你需要从将字符串字面量包装在这个宏中开始:

_T("mystring") 的汉语翻译为:"我的字符串"。

当您构建Unicode时,这将被转换为Unicode字符串。

如果你只是构建 unicode,或者你确定只是处理特定的 unicode 字符串,你可以使用 L"" 标记,这就是 _T 宏在底层所做的事情。

您可能需要包含tchar.h头文件。

在做win32编程时,我通常将字符串声明为TCHAR *szWhatever,以便Win9x的操作与NT / Win2k / XP几乎一样良好。(还有其他一些方便的宏,如LPTSTR等,而MFC包含一些易于转换的宏,以便在实际需要转换ansi和unicode以调用特定API的情况下使用)。

正如其他帖子所说,您正在构建一个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





相关问题
热门标签