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


91

首先,到底是什么?我猜它是一个指针(LPC表示长指针常量),但是“ W”是什么意思?是指向字符串的特定指针还是指向特定字符串的指针?例如,我想关闭一个名为“ TestWindow”的窗口。

HWND g_hTest;
LPCWSTR a;
*a = ("TestWindow");
g_hTest = FindWindowEx(NULL, NULL, NULL, a);
DestroyWindow(g_hTest);

该代码是非法的,并且由于const char [6]无法转换为CONST WCHAR而无法使用。我一点都不明白。我想对所有这些LPCWSTR,LPCSTR,LPSTR有一个清晰的了解。我试图找到一些东西,但是我感到更加困惑。在msdn站点FindWindowEx上声明为

HWND FindWindowEx(      
    HWND hwndParent,
    HWND hwndChildAfter,
    LPCTSTR lpszClass,
    LPCTSTR lpszWindow
);

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


58
欢迎使用Microsoft匈牙利表示法。
Thomas Matthews 2010年

2
实际上,它使文档更具可读性,可怜其他所有内容。
马特·乔纳

1
@Thomas:这不是Microsoft(或此事的Simonyi)最初标记的内容匈牙利符号。当文档小组决定对“可读性”进行一些改进时,它或多或少是事故的结果。他们不是开发人员,因此更改并不优美。背景信息可通过Hugarian符号获得-现在轮到我了:)
IInspectable 2014年

@IInspectable:链接断开
Nicolas Raoul

Answers:


137

LPCWSTR代表“指向常量宽字符串的长指针”。W代表Wide,表示字符串以2个字节的字符存储,而不是normal char。对于任何必须处理非ASCII唯一字符串的C / C ++代码,都是通用的。

要获取分配给的普通C文字字符串LPCWSTR,您需要在其前面加上L前缀

LPCWSTR a = L"TestWindow";

8
只是为了扩展-“长”部分是来自16位Windows的宿醉,可以忽略(例外,您需要用它的名字)
马丁·贝克特

14
“来自16位Windows的宿醉”-可以肯定!
John Dibling

4
不,是正确的。它过去是32位指针。不再有“短” 16位指针,因此如果您设法找到一个,可能会抱怨SPCWSTR
MSalters 2010年

50
天哪。L ??? 字母L?甚至没有函数,L()?只是普通的L?到底是谁想出来的?
约翰·克特吉克

12
@ user396483在许多语言中,常见的是在常量中添加前缀和后缀以更改其表示方式,而又不会改变它们对人类的含义。例如,36UL在C#中与(ulong)36(相同,是一个无符号的64位整数)。 @可以用与字符串前缀相同的语言来使用,从而略微更改它们的解析方式。
Zenexer

12

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

您可以LPCWSTR通过在字符串文字前加L来分配给s:LPCWSTR *myStr = L"Hello World";

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


7

它是指向恒定的宽字符串(即一串宽字符)的长指针。

由于它是一个宽字符串,因此您需要使常量看起来像:L"TestWindow"。我也不会创建中间件a,我只是传递L"TestWindow"参数:

ghTest = FindWindowEx(NULL, NULL, NULL, L"TestWindow");

如果您想得到正确的信息,则“ LPCTSTR”是“文本”字符串-Unicode构建中的宽字符串和ANSI构建中的窄字符串,因此您应该使用适当的宏:

ghTest = FindWindow(NULL, NULL, NULL, _T("TestWindow"));

很少有人关心生成可同时为Unicode和ANSI字符集编译的代码,如果您不能使其真正正常工作,可能会花费很多额外的工作,而收效甚微。在这种特殊情况下,不需要太多额外的工作,但是如果您要处理字符串,则有一组完整的字符串处理宏可以解析为正确的函数。


1
如果您使用的是_T(MAIN_WINDOW)之类的常量,则不必在学究上无误,请使用_T(),否则LMAIN_WINDOW将失败。
Rodolfo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.