Почему конструктор CString (LPCTSTR lpsz) проверяет старшие два байта lpsz? - PullRequest
2 голосов
/ 11 мая 2011

Я читаю исходный код CString в MFC . Мне очень любопытно о способе реализации конструктора CString::CString(LPCTSTR lpsz).

В моем понимании, перед копированием строки, обозначенной lpsz, нужно только проверить, является ли lpsz значением NULL, но не нужно комбинировать с проверкой, является ли HIWORD(lpsz) значением NULL.

Есть ли какой-нибудь MFC парень, проходящий здесь и желающий дать некоторые объяснения?

CString::CString(LPCTSTR lpsz)
{
    Init();
    if (lpsz != NULL && HIWORD(lpsz) == NULL)
    {
        UINT nID = LOWORD((DWORD)lpsz);
        if (!LoadString(nID))
            TRACE1("Warning: implicit LoadString(%u) failed\n", nID);
    }
    else
    {
        int nLen = SafeStrlen(lpsz);
        if (nLen != 0)
        {
            AllocBuffer(nLen);
            memcpy(m_pchData, lpsz, nLen*sizeof(TCHAR));
        }
    }
}

Ответы [ 2 ]

6 голосов
/ 11 мая 2011

Проверяется, передан ли фактический указатель или целочисленный идентификатор ресурса из MAKEINTRESOURCE.В последнем случае он загружает строку из ресурсов.

1 голос
/ 11 мая 2011

Это для загрузки строкового ресурса. См. LoadString() вызов.

...