奇怪的不平等 - WC_BUTTONW不等于L“按钮”?

时间:2012-10-17 23:54:41

标签: c++ string winapi equality

我有一个Button控件包装类,它允许您将现有句柄传递给它,只要它是WC_BUTTON类。我使用GetClassName()来确定这一点。但我有一个问题,代码中的注释应该有助于描述它:

// Initialize from existing handle
Vivify::Button::Button(HWND handle) {
    TCHAR cls[256];
    GetClassName(handle, cls, sizeof(cls));

    Alert(cls);       // MessageBox says "Button"
    Alert(WC_BUTTON); // MessageBox says "Button" also

    Str clsStr = cls;
    Str wcStr  = WC_BUTTON;

    Alert(ToStr<int>(clsStr.length())); // says "6"
    Alert(ToStr<int>(wcStr.length()));  // says "6" also

    // Problem HERE. Evaluates to false. How are they inequal??
    if (cls == WC_BUTTON) {
        SetHandle(handle); // Never gets executed
        m_id = GetDlgCtrlID(handle);
    }
}
顺便说一句,

Strstd::wstring,程序是Unicode。 但是我从GetClassName()WC_BUTTON得到的字符串都是unicode字符串,6个字符都很长,两者都等于"Button",地球上的字符是{{{ 1}}返回if (cls == WC_BUTTON) ??

有人可以解释两个看似完全相同的字符串是如何彼此相等的吗? 或者我如何确定false是否属于按钮/编辑/等。控制?

1 个答案:

答案 0 :(得分:4)

您不是在比较字符串,而是在比较地址。由于地址不同,因此返回false

由于您需要在缓冲区中填写函数,因此您有两个主要选项:

a)使用C字符串和_tcscmpstrcmp的TCHAR版本):

if (_tcscmp(cls, WC_BUTTON) == 0) //0 means equal

b)使用容器。 std::vectorstd::array允许您编辑缓冲区,与std::string不同,但我会展示后者。

TCHAR clsTemp[256];
GetClassName(handle, clsTemp, sizeof clsTemp / sizeof(TCHAR));
std::basic_string<TCHAR> cls = clsTemp;

if (cls == WC_BUTTON) //WC_BUTTON converted to `std::string` to compare

然后cls可以访问cls.c_str()的常量C字符串版本。

请注意,我已更改了GetClassName调用以反映这样一个事实,即它需要缓冲区的长度(以字符为单位),而不是以字节为单位的大小。 TCHAR的大小可能不是一个,所以有必要除以它。