【问题标题】:LPCWSTR error; is there a better solution?LPCWSTR 错误;有更好的解决方案吗?
【发布时间】:2014-04-10 13:52:03
【问题描述】:

我有以下 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);
}

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

【问题讨论】:

  • MessageBox(0, L"First Win32 Program.", L"My App", MB_OK);
  • @DieterLücking 好的,这行得通,您有什么可能的解释可以帮助我吗?我更多的是寻找原因而不是解决方案......如果这是有道理的。我只是想了解发生了什么。
  • @DieterLücking 为什么L(string) 给我英语而LPCWSTR 给我日语/中文?
  • 因为演员表告诉编译器“我有一些类型错误的数据,但我必须撒谎以抑制你的警告。”
  • @Volearix, L"" 用给定的数据形成一个适当的宽字符串文字。强制转换获取窄字符串文字的数据并假装它是宽字符串文字。两者有不同的表示。假装一个是另一个会产生不正确的结果。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    确实,这是LPCWSTR

    typedef const wchar_t* LPCWSTR;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2020-03-08
      相关资源
      最近更新 更多