C++ 为什么CString(LPCTSTR lpsz)构造函数检查lpsz的两个高字节?
我正在MFC中阅读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
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的地址空间来存储。对吗?只是想解释一下为什么函数是这样设计或运行的。