Важным моментом является то, что при использовании DECLARE_SERIAL
и IMPLEMENT_SERIAL
в ваш класс добавляется член CRuntimeClass
, содержащий имя в поле m_lpszClassName
.
Этот CRuntimeClass
объект также добавляется в список, поддерживаемый платформой, в которой производится поиск при динамическом создании классов.
Вы должны убедиться, что объект CRuntimeClass
содержит старое имя вашего класса в m_lpszClassName
.
У вас есть два варианта:
Переопределить конструкцию
CRuntimeClass
объект для установки имени
Изменить имя класса, хранящееся в его
m_lpszClassName
поле после того, как оно имеет
создано
Переопределение конструкции объекта CRuntimeClass
Для этого вам необходимо создать собственные версии DECLARE_DYMAMIC
, DECLARE_DYNCREATE
, DECLARE_SERIAL
, IMPLEMENT_DYMAMIC
, IMPLEMENT_DYNCREATE
и IMPLEMENT_SERIAL
.
Вы можете просто скопировать и переименовать существующие реализации.
В вашей версии IMPLEMENT_DYNAMIC
вам нужно изменить код, который создает CRuntimeClass
, чтобы он инициализировался с именем старого класса.
Изменение имени класса, хранящегося в поле m_lpszClassName после создания объекта CRuntimeClass
Поскольку CRuntimeClass
создается статическим инициализатором, я не думаю, что вы можете сделать это из своего класса.
Я думаю, что лучшее место для этого - приложение InitInstance
.
Добавьте переменную static char*
в класс вашего приложения, содержащий старое имя класса.
Затем в InitInstance
установите поле m_lpszClassName
в CRuntimeClass
.
вашего класса.
- Первый метод имеет преимущество
держать изменения в классе
сам по себе.
- Второй делает заявку
знать о классе таким образом, чтобы он
возможно, не должно быть.
В любом случае, первое, что нужно сделать, это полностью ознакомиться с тем, как работают динамическое создание и сериализация.