【问题标题】:TCHAR[], LPWSTR, LPTSTR and GetWindow Text functionTCHAR[]、LPWSTR、LPTSTR 和 GetWindow 文本函数
【发布时间】:2010-02-09 19:07:38
【问题描述】:

所以 GetWindowText 在 MSDN 上声明如下:

int GetWindowText(      
    HWND hWnd,
    LPTSTR lpString,
    int nMaxCount
);

但是为了让代码正常工作,我们必须将第二个参数声明为

TCHAR[255] WTitle;

然后调用函数GetWindowText(hWnd,Wtitle,255); LPTSTR 是指向 tchar 数组的指针,所以声明 LPTSTR 类似于声明 TCHAR[]?但它不是这样工作的。 使用 TCHAR[] 时,程序返回有效的 GetWindowText 结果(它是一个整数,等于标题中的符号数)。问题是:如何从 TCHAR[] 中获得确切的标题?像

这样的代码
TCHAR[255] WTitle;
cout<< WTitle;

cout<< *Wtitle;

返回数字。如何将其与给定的字符串进行比较?

TCHAR[4] Test= __T("TEST")
if (WTitle == Test) do smth

也不行。

【问题讨论】:

  • 鉴于您已经在编写一个无法以任何方式编译的程序,请考虑放弃 TCHAR。它已经过时了,请使用 wchar_t。

标签: c++ string winapi tchar


【解决方案1】:

哇,让我们看看从哪里开始。

首先,WTitle 的声明需要如下所示:

TCHAR WTitle[255];

接下来,如果 cout 不工作 write,那是因为你处于 Unicode 模式,所以你需要这样做:

wcout << WTitle;

或者为了更好地适应整个 tchar 框架,你可以添加这个(实际上,我很惊讶这还不是 tchar.h 的一部分):

#ifdef _UNICODE
    #define tcout wcout
#else
    #define tcout cout
#endif

然后使用:

tcout << WTitle;

【讨论】:

  • +1 用于使用 tcout 而不是 wcout 来匹配 TCHAR 和 LPTCSTR。
  • +1 用于显示 wcout。 (仅供参考,谷歌搜索cout lpwstr 给出了第三个结果。)
【解决方案2】:

好的,先来几个定义。

“T”类型的定义将评估为 CHAR(单字节)或 WCHAR(双字节),具体取决于您是否在构建设置中定义了 _UNICODE 符号。目的是让您使用一组源代码同时针对 ANSI 和 UNICODE。

定义:

TCHAR title[100];
TCHAR * pszTitle;

...等价。第一个定义了 100 个 TCHAR 的缓冲区。第二个定义了一个指向一个或多个 TCHAR 的指针,但不指向缓冲区。此外,

sizeof(title) == 100   (or 200, if _UNICODE symbol is defined)
sizeof(pszTitle) == 4  (size of a pointer in Win32)

如果你有这样的功能:

void foo(LPCTSTR str);

...您可以将上述两个变量中的任何一个传入:

foo(title);    // passes in the address of title[0]
foo(pszTitle); // passes in a copy of the pointer value

好的,所以你得到数字的原因可能是因为你确实定义了 UNICODE(所以字符很宽),并且你正在使用 cout,它特定于单字节字符.请改用 wcout

wcout << title;

最后,这些都行不通了:

TCHAR[4] Test == __T("TEST")   ("==" is equality comparison, not assignment)
if (WTitle == Test) do smth    (you're comparing pointers, use wcscmp or similar)

【讨论】:

  • ofc 我的意思是 TCHAR[4] Test = __T("TEST") 您给出了最完整的答案,谢谢!
【解决方案3】:

简答:除非您正在为 Win98 编写代码,否则请使用 wchar_t 而不是 TCHARwcout 而不是 cout

长版:

TCHAR 类型的存在允许以多种字符串模式编译代码。例如支持 ASCII 和 Unicode。 TCHAR 类型将在没有设置的情况下有条件地编译为适当的字符类型。

所有新的 Win 系统都基于 Unicode。当 ASCII 字符串被传递给 OS 函数时,它们被转换为 unicode 并调用真正的函数。所以最好在整个应用程序中只使用 Unicode。

【讨论】:

    【解决方案4】:

    使用 _tcscmp 或变体(接受要比较的字符数)。 http://msdn.microsoft.com/en-us/library/e0z9k731.aspx

    喜欢:

    if (_tcscmp(WTitle, Test) == 0) {
        // They are equal! Do something.
    }
    

    【讨论】:

      【解决方案5】:

      在 C 中,wchar_t 是一些整数类型(通常是短整型)的 typedef。在 C++ 中,它必须是一个独立的类型——但微软的编译器默认使用 typedef。要使其成为自己的单独类型,您需要使用/Zc:wchar_t 编译器开关。顺便说一句,我不知道这是否会完全解决问题——我不确定库是否有真正的 wchar_t 重载作为本机类型,以便将它们打印为字符而不是短整数。

      不过,一般来说,我建议不要乱用 Microsoft 的“T”变体——让它们正确是一件痛苦的事,而且它们的主要目的是提供与 16 位 Windows 的兼容性。鉴于距离该行的最后一个版本已经过去了大约 10 年,在新代码中忽略它可能是安全的,除非您真的确定至少有一些客户真正使用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-21
        • 2015-03-18
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        • 2012-05-20
        • 2010-09-24
        • 2013-12-09
        相关资源
        最近更新 更多