

Программирование на языке 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++;
}
}
Похожие статьи: Метод Write
