2011-05-11 3 views
2

CString의 소스 코드를 MFC에서 읽습니다. 나는 생성자 CString::CString(LPCTSTR lpsz)의 구현 방법에 대해 매우 궁금하다. 나의 이해에서왜 CString (LPCTSTR lpsz) 생성자가 lpsz의 상위 2 바이트를 확인합니까?

, lpsz로 표시되는 문자열을 복사하기 전에, 그것은 단지 lpszHIWORD(lpsz)NULL 경우 확인과 결합하는 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)); 
     } 
    } 
} 
+0

그러나 HIWORD를 확인할 때 lpsz가 null인지 확인하지 않습니다. – ralphtheninja

+0

어떻게됩니까? 'If ​​(lpsz! = NULL && HIWORD (lpsz) == NULL)'처음에 lpsz가 NULL인지 아닌지 검사하고, HIWORD를 확인합니다. – MikMik

답변

6

MAKEINTRESOURCE에서 실제 포인터 또는 정수 리소스 식별자가 전달되는지 여부를 확인합니다. 후자의 경우 리소스에서 문자열을로드합니다.

+0

새 버전에서는'CheckImplicitLoad'에서 검사가 이루어지기 때문에 조금 더 명확합니다. 그리고 HIWORD가 NULL인지 검사하는 대신'IS_INTRESOURCE' 매크로 – MikMik

+0

을 사용합니다. 많은 감사합니다. lpsz가 null이 아니고 lpsz의 상위 단어가 0이면 문자열로 하위 단어를 만듭니다. 문자열을 내부 버퍼에 저장합니다. Windows가 숨겨진 규칙을 가지고 있는지, 프로그래머에게 할당 된 주소 공간에 대해 상위 단어는 2^16 = 64KB가 OS 용으로 예약되었음을 의미합니다. 따라서 낮은 64KB 주소 공간을 사용하여 저장하는 것은 허용되지 않습니다. 권리? 왜 그 기능이 설계되었거나 그렇게 행동했는지 이유를 찾으려고 노력합니다. – Cary

1

문자열 리소스를로드하기위한 것입니다. LoadString() 호출을 참조하십시오.