我有以下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);
}
由于一些奇怪的原因,我的申请是用日语或中文提出的。因此失去了这个。
答案 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;