【问题标题】:What does LPCWSTR stand for and how should it be handled with?LPCWSTR 代表什么,应该如何处理?
【发布时间】:2011-01-14 21:41:14
【问题描述】:

首先,它到底是什么?我猜它是一个指针(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。 请帮忙。

【问题讨论】:

  • 欢迎使用 Microsoft 匈牙利表示法。
  • 它实际上使文档更具可读性,可惜关于它的其他一切。
  • @Thomas:这不是微软(或 Simonyi)最初标记的 Hungarian Notation。当文档组决定进行一些“可读性”改进时,这或多或少是意外的结果。他们不是开发人员,因此这些更改并不优雅。背景信息可在Hugarian notation - it's my turn now :) 获得
  • @IInspectable:链接断开

标签: c++ winapi lpcstr


【解决方案1】:

LPCWSTR 代表“指向常量宽字符串的长指针”。 W 代表 Wide,表示字符串存储在 2 字节字符中,而不是普通的 char。对于必须处理非 ASCII 字符串的任何 C/C++ 代码都很常见。=

要获得一个普通的 C 文字字符串来分配给 LPCWSTR,你需要在它前面加上 L

LPCWSTR a = L"TestWindow";

【讨论】:

  • 只是为了扩展 - 'LONG' 部分是 16 位窗口的后遗症,可以忽略(除非您在名称中需要它)
  • “来自 16 位 Windows 的后遗症”——这是肯定的!
  • 不,这是正确的。它曾经是并且现在是一个 32 位指针。不再有“短”的 16 位指针,因此如果您设法找到 SPCWSTR,您可能会抱怨。
  • 我的上帝。我???字母 L?甚至没有一个函数,L()?只是普通的L?到底是谁想出来的??
  • @user396483 在许多语言中,为常量添加前缀和后缀以改变它们的表示方式是很常见的,而不会改变它们对人类的意义。例如,C# 中的 36UL(ulong)36 相同(ulong 是无符号的 64 位整数)。 @ 可以在与字符串前缀相同的语言中使用,稍微改变它们的解析方式。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    因为它是一个宽字符串,所以你想让你的常量看起来像:L"TestWindow"。我也不会创建中间 a,我只是将 L"TestWindow" 传递给参数:

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

    如果你想学究式地正确,“LPCTSTR”是一个“文本”字符串——在 Unicode 构建中是宽字符串,在 ANSI 构建中是窄字符串,因此您应该使用适当的宏:

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

    尽管如此,很少有人关心生成可以同时编译为 Unicode 和 ANSI 字符集的代码,如果你不能让它真正正确地工作,可能会付出相当多的额外工作而收效甚微。在这种特殊情况下,没有太多额外的工作,但如果您正在操作字符串,则有一整套字符串操作宏可以解析为正确的函数。

    【讨论】:

    • 你不需要学究气,如果你使用像 _T(MAIN_WINDOW) 这样的常量,请使用 _T() 否则 LMAIN_WINDOW 会失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2017-09-01
    • 2011-01-14
    • 1970-01-01
    • 2017-11-18
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多