C++ 为什么CString(LPCTSTR lpsz)构造函数检查lpsz的两个高字节?

C++ 为什么CString(LPCTSTR lpsz)构造函数检查lpsz的两个高字节?,c++,mfc,visual-c++-6,C++,Mfc,Visual C++ 6,我正在MFC中阅读CString的源代码。我很好奇构造函数CString::CString(LPCTSTR lpsz)的实现方式 据我所知,在复制由lpsz指示的字符串之前,它只需要检查lpsz是否为NULL,而不需要结合检查HIWORD(lpsz)是否为NULL 是否有MFC的人经过这里并愿意给出一些解释 CString::CString(LPCTSTR lpsz) { Init(); if (lpsz != NULL && HIWORD(lpsz) == NU

我正在MFC中阅读
CString
的源代码。我很好奇构造函数
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));
        }
    }
}

它检查是否从中传递了实际指针或整数资源标识符。在后一种情况下,它从资源中加载字符串。

这是用于加载字符串资源的。查看调用。

但在检查HIWORDHow-come-not时,它不会检查lpsz是否为null
if(lpsz!=NULL&&HIWORD(lpsz)==NULL)
首先检查lpsz是否为NULL,如果不为NULL,则检查更新版本中的HIWORD,这一点更清楚,因为检查是在
CheckImplicitLoad
中完成的,它使用宏
而不是检查HIWORD是否为NULL,这一点是理解的。非常感谢。如果lpsz不为空,但lpsz的高阶字为零,则将低阶字转换为字符串。它只是将字符串存储在其内部缓冲区中。Windows是否有隐藏规则,对于分配给程序员的地址空间,高阶字表示2^16=64KB是为操作系统保留的。因此,不允许使用低64KB的地址空间来存储。对吗?只是想解释一下为什么函数是这样设计或运行的。