LPCWSTR错误;有更好的解决方案吗?

时间:2014-04-10 13:52:04

标签: c++ visual-c++ visual-studio-2012 lpcwstr

我有以下c ++代码,似乎在我尝试放置一个字符串的任何地方,我必须转换它以避免`不能将参数2从' const char [x]转换为LPCWSTR。我知道我可以通过简单的转换来解决这个问题,但有什么方法可以转换几乎我提供的每个字符串?我是一名学习c ++的c#开发人员,所以我猜测我错过了一些基本的语言概念,如果有人能够对此有所了解,我将不胜感激!

#include <Windows.h>
#include <string>
using namespace std;

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   PSTR cmdLine,
                   int showCmd)
{
    MessageBox(0, "First Win32 Program.", "My App", MB_OK);
}

有没有比这更好的解决方案:

{
    MessageBox(0, (LPCWSTR)"First Win32 Program.", (LPCWSTR)"My App", MB_OK);
}

由于一些奇怪的原因,我的申请是用日语或中文提出的。因此失去了这个。

enter image description here

2 个答案:

答案 0 :(得分:2)

使用L"text"创建字符串。通过这种方式,您可以创建一个广泛的字符串,这可能是WinAPI最可能出现的。

#include <Windows.h>
#include <string>
using namespace std;

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   PSTR cmdLine,
                   int showCmd)
{
    MessageBox(0, L"First Win32 Program.", L"My App", MB_OK);
}

问题是您通过使用C样式转换为LPCWSTR来注入一个窄字符串。所以你的两个窄字符(每个8位)将在一个UNICODE字符(每个16位)中混合。

答案 1 :(得分:1)

您应该在文字中使用L前缀。 WINAPI主要使用宽字符串。

至于为什么这个前缀有效,这里是标准中的相关部分(§2.14.5/ 11):

  

以L开头的字符串文字,例如L“asdf”,是一个宽字符串文字。宽字符串文字具有类型   “n const wchar_t的数组”,其中n是下面定义的字符串的大小;它有静态存储持续时间   并使用给定的字符初始化。

你得到的垃圾是因为你正在做一个没有任何意义的演员表,并最终得到了库试图解释为宽字符串的垃圾数据。

确实,这是LPCWSTR

typedef const wchar_t* LPCWSTR;