【问题标题】:Compare TCHAR to String将 TCHAR 与字符串进行比较
【发布时间】:2013-07-30 05:11:01
【问题描述】:

在 C++ 方面,我仍然是一个极端的菜鸟。我目前讨厌的一件事(截至目前)是 winAPI 中的 1,000,000,000 种不同类型的变量。我为检查窗口是否存在而制作的这个小程序非常快。但最难的部分是什么?只需将“字符串”比较在一起,看看它是否匹配。最简单的部分是最难的!

无论如何,我的问题是:我如何比较 atoFind,看看它们是否匹配?

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam){
    TCHAR a[260];
    string toFind = "Google Chrome";

    hwnd = GetParent(hwnd);
    GetWindowText(hwnd, a, sizeof(a));

    if(strcmp(a,toFind) == 0){          //doesn't work
        cout << "found the window";
    }

    return TRUE;
}

【问题讨论】:

  • 你编译时是否定义了UNICODE?答案取决于TCHARwchar_t 还是char
  • @JesseGood "字符集:使用 Unicode 字符集"
  • @Jesse:没必要。 t 系列的全部意义在于抽象出是否定义了 UNICODE
  • @JesseGood 我不得不将 TCHAR 用于 GetWindowText 函数。
  • 您的代码中存在缓冲区溢出。 GetWindowText 想要以字符为单位的大小,而您正在给它以字节为单位的大小。如果TCHARwchar_t,那么两者就不一样了。

标签: c++ winapi


【解决方案1】:

最简单的方法可能是一开始就不要使用 c 样式的数组,因为您使用 UNICODE 进行编译以使用 std::wstring

std::wstring a;
a.resize(260);
std::wstring toFind = L"Google Chrome";

hwnd = GetParent(hwnd);
int size = GetWindowText(hwnd, &a[0], a.size());
a.resize(size);

那么就很简单了:

if(a == toFind)
{

}

【讨论】:

  • 我认为这实际上不会按原样工作。 const char* const Value = "Google Chrome"; string buf(Value); string buf2; buf2.resize(260); strcpy(&amp;buf2[0], Value); cout &lt;&lt; "Equal? " &lt;&lt; (buf == buf2) &lt;&lt; "\n"; 这为我打印Equal? 0string 可以包含嵌入的空值。
  • @Joel:感谢您的评论。我忘了在通话后调整字符串的大小(更新)。在您的示例中,只需在 cal 之后添加 buf2.resize(buf.size()); strcpy
  • 在这种情况下,它包含嵌入的 nuls。在[260] 有一个,但GetWindowText(hwnd, &amp;a[0], 260) 添加了一个 nul before [260]
  • 对。该代码现在已修复,但最初它会本质上将"Google Chrome""Google Chrome\0\0\0\0\0..." 进行比较。使用常规的 C 字符串和 strcmp,这本来可以,但使用 std::basic_string,它们比较不相等,因为 std::basic_string 不是以空值结尾的。
【解决方案2】:

在这种情况下,您不应使用 string,而应使用 TCHAR[],然后与适当的包装函数进行比较:

TCHAR toFind[] = _T("Google Chrome");

...

if (_tcscmp(a, toFind) == 0)

TCHAR 可能是 charwchar_t,这取决于是否定义了 UNICODE(我当然希望它在您的情况下定义,这也可以解释为什么它是'不直接工作)。因此,如果您决定使用它(我不会,因为我很确定我永远不会再次为 Windows 9x/ME 编写软件,或者通常是不支持 Unicode 的软件),您还必须遵守它的规则。

【讨论】:

  • 更简单的解决方案是键入tstring(即std::basic_string&lt;TCHAR&gt;)。但事实上,今天的简单解决方案是UNICODE
  • 我不知道能够将std::basic_string&lt;T&gt; 用作普通的旧T[],因为不是真正的C++ 开发人员。无论如何,杰西的回答可能会更好(但也指出了这种方法的一个陷阱)。
【解决方案3】:

将字符串类型从“string”更改为“wstring”。您还必须将“strcmp”更改为“wstrcmp”。基本上,wstring 是 UNICODE 中使用的宽字符串。

【讨论】:

    【解决方案4】:

    std::string 是 std::basic_string 的 typedef。 std::wstring 是 typedef std::basic_string。

    你想要的是

    typedef std::basic_string<TCHAR> tstring;
    

    然后在 std::string 的位置使用。

    另请参阅tchar vs wstringstd::basic_string

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-21
      • 2012-10-06
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多