Программирование на Visual C++. Архив рассылки | страница 6
>CRunTimeClass *pClass = RUNTIME_CLASS(СMyObject);
> // получаем ук-ль на структуру CRunTimeClass
>CObject *pNewObject = pClass->CreateObject();
> // создаем новый объект нужного класса
>ASSERT(pNewObject->IsKindOf(RUNTIME_CLASS(CMyObject));
> // проверяем класс объекта
Меня удивило, что большинство из вас подписывается именно на HTML – я думал, наши люди как никакие другие считают каждый килобайт. Но, видимо, времена меняются – в лучшую сторону. Дай бог! Так что по вышеописанным причинам я решил поднапрячься и сработать собственный HTML-вариант. То, что получилось, сейчас перед вами, уважаемые HTML-подписчики. Тех, кто выписывает текстовый вариант, уговаривать подписаться на HTML я не буду, потому что прекрасно их понимаю ;) Оба варианта я буду делать лично, никакой автоматической генерации. Enjoy.
Мне пришло интересное письмо на тему предыдущего выпуска. Хочу предложить его вашему вниманию:
Приветствую!
Я только что обнаружил эту рассылку, подписался и 2 первых выпуска прочитал в архиве. Очень надеюсь, что смогу оказать посильную помощь автору и читателям рассылки, так как около 30 лет занимаюсь программированием и последние 3-4 года – Visual C++. На работе сейчас я программирую именно на этом [языке – AJ], Visual Studio 6.0
В отношении вопроса Броника. Конечно, система сериализации для ActiveX имеется. Для этого рекомендуется использовать класс COLEControl (порожденный из CWnd –>CCMDTarget->CObject).
Вот пример из MSDN (у меня есть этот хелп и на работе и дома)
>void CMyCtrl::Serialize(CArchive& ar) {
> DWORD dwVersion = SerializeVersion(ar, MAKELONG(_wVerMinor, _wVerMajor));
> SerializeExtent(ar);
> SerializeStockProps(ar);
> if (ar.IsLoading()) {
> // загрузить свойства
> } else {
> // сохранить свойства
> }
>}
Пару замечаний относительно сериализации. Вот пример, как можно поддерживать версию при сериализации. Это важная вещь, поскольку в классы регулярно заносятся новые данные, и чтение-сериализация должны поддерживать старые версии распространенных среди пользователей Вашей программы файлов.
>IMPLEMENT_SERIAL(CMyClass, CObject, VERSIONABLE_SCHEMA | 2)
>// 2- Номер текущей (новой) версии. 1 - номер старой версии
>void CMyClass::Serialize(CArchive& ar) {
> if (ar.IsLoading()) {
> UINT Version;
> ar.ReadClass(RUNTIME_CLASS(CMyClass), &Version);
> switch(Version) {
> case 2:
> // чтение по-новому
> break;
> case 1:
> // чтение по-старому
> break;
> }
> }
> if (ar.IsStoring()) {
> ar.WriteClass( RUNTIME_CLASS(CMyClass));