0

我有以下 c++ 代码,似乎在我尝试放置字符串的任何地方,我都必须对其进行转换以避免“无法将参数 2 从 'const char[x] 转换为 LPCWSTR。我知道我可以通过做一个简单的转换来解决这个问题,但是有什么办法可以绕过我提供的几乎每个字符串?我是 ac# 开发人员,正在学习 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);
}

出于某种奇怪的原因,我的申请以日文或中文出现。所以迷失了这个。

在此处输入图像描述

4

2 回答 2

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 位)中。

于 2014-04-10T13:56:48.883 回答
1

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

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

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

你得到的垃圾是因为你正在做一个没有任何意义的强制转换,并最终得到库试图将其解释为宽字符串的垃圾数据。

确实,这是一个LPCWSTR

typedef const wchar_t* LPCWSTR;
于 2014-04-10T13:57:39.367 回答