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

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

Что хранит в себе информация времени выполнения?


Что хранит в себе информация времени выполнения? Есте­ственно, она должна хранить имя класса. Для хранения имени класса служит поле mJpszClassName. Для того чтобы мы могли создать объект этого класса динамически, мы должны знать раз­мер, который занимает объект этого класса. Размер объекта хра­нится в поле m__nObjectSize. Поле m__wSchema фактически яв­ляется номером версии класса. Дело в том, что описание клас­са может изменяться от версии программы к версии, поэтому иногда (в частности, в ходе процесса сериализации) возникает необходимость узнать, к какой версии описания класса принад­лежит объект.

Для того чтобы в ходе выполнения программы мог быть создан объект класса, который описывает CRuntimeClass, она хранит в себе указатель на конструктор по умолчанию этого класса – поле m_pfnCreateObject (CObject* (PASCAL* m_pfnCreateObject)()). Не­посредственно для создания объекта можно воспользоваться ме­тодом CreateObjectQ, который, выполняя функцию, указатель на которую находится в поле m_pfnCreateObject, возвращает указатель на созданный объект.

Если в программе возникла необходимость получить информацию о том классе, от которого был унаследован описыва­емый в структуре файл, то для этого можно воспользоваться полем mjDfnGetBaseClass (CRuntimeClass* (PASCAL* m_pfnGetBase-Class)()), в котором находится указатель на метод, позволяющий получить такую информацию.

Для сохранения объекта описываемого класса в архиве служит метод Store(). Восстановить объект из архива можно при помощи метода Load(). О том, как работают эти методы, мы поговорим при рассмотрении процесса сериализации.

Но, наверное, самым интересным полем является поле mjDNextClass. Судя по тому, что оно фактически является указате­лем на информацию времени исполнения, а также взглянув на на­звание этого поля, можно догадаться, что все структуры типа CRuntimeClass объединены в однонаправленный список. Зная ука­затель на начало этого списка, мы можем получить информацию о том, какие классы зарегистрированы в системе.

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