LPCWSTR代表什么,应如何处理?

lhj*_*362 79 c++ winapi lpcstr

首先,究竟是什么?我猜它是一个指针(LPC意味着长指针常量),但"W"是什么意思?它是指向字符串的特定指针还是指向特定字符串的指针?例如,我想关闭一个名为"TestWindow"的窗口.

HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);
Run Code Online (Sandbox Code Playgroud)

代码是非法的,它不起作用,因为const char [6]无法转换为CONST WCHAR.我根本得不到它.我想清楚地了解所有这些LPCWSTR,LPCSTR,LPSTR.我试图找到一些东西,但我更加困惑.在msdn网站FindWindowEx被声明为

HWND FindWindowEx(      
    HWND hwndParent,
    HWND hwndChildAfter,
    LPCTSTR lpszClass,
    LPCTSTR lpszWindow
);
Run Code Online (Sandbox Code Playgroud)

所以最后一个参数是LPCSTR,编译器要求LPCWSTR.请帮忙.

Jar*_*Par 122

LPCWSTR代表"指向恒定宽字符串的长指针".W代表Wide,表示字符串与正常字符相比存储在2字节字符中char.对于必须处理非ASCII字符串的任何C/C++代码都是通用的.=

要获得要分配给a的普通C字符串LPCWSTR,需要在其前面加上L.

LPCWSTR a = L"TestWindow";
Run Code Online (Sandbox Code Playgroud)

  • 天哪.大号??? 字母L?甚至不是函数,L()?只是简单的L?谁想到了? (42认同)
  • "16位Windows的宿醉" - 这是肯定的! (13认同)
  • @ user396483在许多语言中常见的是为常量添加前缀和后缀以更改它们的表示方式,而不会将其含义更改为人类.例如,C#中的`36UL`与`(ulong)36`(ulong是无符号的64位整数)相同.`@`可以使用与字符串前缀相同的语言,改变它们的解析方式. (11认同)
  • 只是为了扩展 - 'LONG'部分是16位窗口的宿醉,可以忽略(在名称中你需要它) (6认同)
  • 不,这是对的.它是并且是32位指针.没有"短"16位指针,所以如果你设法找到一个"SPCWSTR",你可能会抱怨. (4认同)
  • @IInspectable:我已经研究过匈牙利表示法。我最大的烦恼之一是,当变量的类型发生变化时,没有人更新符号。我更喜欢将变量的类型保留在名称之外。您应该下载并阅读所有反对匈牙利表示法的文章。另外,请记住,微软并不制定标准;而是由微软制定的。他们只传播了许多副本。而且从匈牙利表示法的文章来看,MS并没有完全遵循它。 (3认同)
  • 至少VS朋友应该警告需要领先的`L`,甚至不是快速修复建议...... (2认同)
  • @Thomas:匈牙利表示法的最终目标是[让错误的代码看起来错误](http://www.joelonsoftware.com/articles/Wrong.html)。Apps 匈牙利表示法与具体数据类型的编码**无关**。它有助于消除存储屏幕或客户端坐标的“RECT”、表示逻辑或设备像素的“int”、以字符(“cch”)或字节(“cb”)表示的缓冲区大小参数或“char*”之间的歧义。 ` 指向 ASCII 或 UTF-8 编码的字符串。如果您能找到一篇文章,其中包含针对 **Apps** HN 的单一有效论据,请发表。不过我不会屏住呼吸。 (2认同)
  • L 很可笑,如果您需要将变量转换为 LPCWSTR 怎么办?!!微软怎么会有这么疯狂的观点?! (2认同)

Mat*_*ner 10

LPCWSTR相当于wchar_t const *.它是指向宽字符串的指针,该字符串不会被函数调用修改.

您可以LPCWSTR通过将L添加到字符串文字来指定s:LPCWSTR *myStr = L"Hello World";

LPC T STR和任何其他T类型,根据项目的Unicode设置采用字符串类型.如果_UNICODE为您的项目定义,则T类型的使用与宽字符形式相同,否则为Ansi形式.相应的函数也将以这种方式调用:FindWindowEx定义为FindWindowExAFindWindowExW取决于此定义.


Jer*_*fin 6

它是指向常量宽字符串(即一串宽字符)的长指针.

因为它是一个宽字符串,你想让你看起来像:L"TestWindow".我也不会创建中间体a,我只是传递L"TestWindow"参数:

ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");
Run Code Online (Sandbox Code Playgroud)

如果你想成为迂腐正确的,一个"LPCTSTR"是一个"文本"串 - 在Unicode构建和在ANSI构建一个窄字符串宽字符串,所以你应该使用适当的宏:

ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));
Run Code Online (Sandbox Code Playgroud)

很少有人关心如何生成可以为Unicode和ANSI字符集编译的代码,如果你没有让它真正正常工作,那么可能需要额外的工作才能获得很少的收益.在这种特殊情况下,没有太多额外的工作,但如果你正在操作字符串,那么就有一整套字符串操作宏可以解析为正确的函数.