Программирование на языке MFC

Мой второй блог в серии программирования

Метод WriteClass


Но мы же хотим добавить в архив не нулевой указатель, а ука­затель на реальный объект, т. е. наш указатель на объект никак не будет нулевым, не так ли? Что происходит в нашем случае? Ме­тод WriteObject() пытается из хэш-таблицы выбрать данные с клю­чом, равным указателю на объект. В том случае, если информация об объекте ранее в хэш-таблицу не записывалась, WriteObject() принимает решение о том, что ранее в процессе записи в архив этот объект не встречался, следовательно, помимо данных об объ­екте необходимо занести в архив и информацию о классе объекта. В этом случае метод WriteObjectQ при помощи метода GetRuntimeClass() получает информацию времени выполнения объ­екта, используя которую пытается затем записать в архив данные о том, к какому классу принадлежит объект. Данные о классе в ар­хив записываются при помощи метода WriteClass():

void CArchive::WriteClass(const CRuntimeClass* pClassRef) {

ASSERT(pClassRef != NULL);

ASSERT(IsStoring()); // proper direction

if (pClassRef->m_wSchema == OxFFFF) {

TRACE1("Warning: Cannot call WriteClass/WriteObject

for %hs.\n", pClassRef->m_lpszClassName) ; AfxThrowNotSupportedException();

}

// make sure m_pStoreMap is initialized MapObject(NULL);

// write out class id of pOb, with high bit set to indicate // new object follows

II ASSUME: initialized to 0 map DWORD nClassIndex;

if ((nClassIndex = (DWORD)(*m_pStoreMap)[(void*)pClassRef])

!= 0)

{

// previously seen class, write out the index tagged // by high bit

if (nClassIndex < wBigObjectTag)

*this « (WORD)(wClassTag | nClassIndex);

else

{

*this « wBigObjectTag;

*this « (dwBigClassTag I nClassIndex);

}

}

else {

// store new class

*this « wNewClassTag; pClassRef->Store(*this);

// store new class reference in map, checking for overflow CheckCount();

(*m_pStoreMap)[(void*)pClassRef] = (void*)m_nMapCount++;

}

}

Похожие статьи: