Поделиться через


Службы модели объекта во время выполнения

Классы CObject и CRuntimeClass инкапсулируют несколько служб объектов, включая доступ к сведениям о классе во время выполнения, сериализации и созданию динамических объектов. Все классы, производные от CObject наследуемой этой функции.

Доступ к сведениям о классе во время выполнения позволяет определять сведения о классе объекта во время выполнения. Возможность определить класс объекта во время выполнения полезна, если требуется дополнительная проверка аргументов функции и когда необходимо написать код специального назначения на основе класса объекта. Сведения о классе времени выполнения не поддерживаются непосредственно языком C++.

Сериализация — это процесс записи или чтения содержимого объекта в файл или из него. Сериализация можно использовать для хранения содержимого объекта даже после завершения работы приложения. Затем объект можно считывать из файла при перезапуске приложения. Такие объекты данных, как говорят, являются "постоянными".

Динамическое создание объекта позволяет создавать объект указанного класса во время выполнения. Например, объекты документов, представлений и фреймов должны поддерживать динамическое создание, так как платформа должна создавать их динамически.

В следующей таблице перечислены макросы MFC, поддерживающие сведения о классах во время выполнения, сериализацию и динамическое создание.

Дополнительные сведения об этих службах объектов во время выполнения и сериализации см. в статье CObject Class: Accessing Run-Time Class Information.

Макросы служб объектной модели во время выполнения

Имя Описание
DECLARE_DYNAMIC Обеспечивает доступ к сведениям о классе во время выполнения (необходимо использовать в объявлении класса).
DECLARE_DYNCREATE Включает динамическое создание и доступ к сведениям о классе во время выполнения (необходимо использовать в объявлении класса).
DECLARE_SERIAL Включает сериализацию и доступ к сведениям о классе во время выполнения (необходимо использовать в объявлении класса).
IMPLEMENT_DYNAMIC Обеспечивает доступ к сведениям о классе во время выполнения (необходимо использовать в реализации класса).
IMPLEMENT_DYNCREATE Включает динамическое создание и доступ к сведениям во время выполнения (необходимо использовать в реализации класса).
IMPLEMENT_SERIAL Разрешает сериализацию и доступ к сведениям о классе во время выполнения (необходимо использовать в реализации класса).
RUNTIME_CLASS Возвращает структуру CRuntimeClass , соответствующую именованного класса.

OLE часто требует динамического создания объектов во время выполнения. Например, приложение OLE-сервера должно иметь возможность динамически создавать элементы OLE в ответ на запрос от клиента. Аналогичным образом сервер автоматизации должен иметь возможность создавать элементы в ответ на запросы клиентов службы автоматизации.

Библиотека классов Microsoft Foundation предоставляет два макроса, относящиеся к OLE.

Динамическое создание объектов OLE

Имя Описание
AFX_COMCTL32_IF_EXISTS Определяет, реализует ли библиотека Common Controls указанный API.
AFX_COMCTL32_IF_EXISTS2 Определяет, реализует ли библиотека Common Controls указанный API.
DECLARE_OLECREATE Позволяет создавать объекты с помощью автоматизации OLE.
DECLARE_OLECTLTYPE GetUserTypeNameID Объявляет функции и GetMiscStatus члены класса элемента управления.
DECLARE_PROPPAGEIDS Объявляет, что элемент управления OLE предоставляет список страниц свойств для отображения его свойств.
IMPLEMENT_OLECREATE Позволяет создавать объекты системой OLE.
IMPLEMENT_OLECTLTYPE GetUserTypeNameID Реализует функции и GetMiscStatus члены класса элемента управления.
IMPLEMENT_OLECREATE_FLAGS Этот макрос или IMPLEMENT_OLECREATE должен отображаться в файле реализации для любого класса, который использует DECLARE_OLECREATE.

AFX_COMCTL32_IF_EXISTS

Определяет, реализует ли библиотека Common Controls указанный API.

Синтаксис

AFX_COMCTL32_IF_EXISTS(  proc );

Параметры

proc
Указатель на строку, завершающую значение NULL, содержащую имя функции, или задает порядковое значение функции. Если этот параметр является порядковым значением, он должен находиться в слове с низким порядком; Слово с высоким порядком должно быть равно нулю. Этот параметр должен находиться в Юникоде.

Замечания

Используйте этот макрос, чтобы определить, указана ли библиотека Common Controls функцию, указанную proc вместо вызова GetProcAddress.

Требования

afxcomctl32.h, afxcomctl32.inl

AFX_COMCTL32_IF_EXISTS2

Определяет, реализует ли библиотека Common Controls указанный API (это версия Юникода AFX_COMCTL32_IF_EXISTS).

Синтаксис

AFX_COMCTL32_IF_EXISTS2( proc );

Параметры

proc
Указатель на строку, завершающую значение NULL, содержащую имя функции, или задает порядковое значение функции. Если этот параметр является порядковым значением, он должен находиться в слове с низким порядком; Слово с высоким порядком должно быть равно нулю. Этот параметр должен находиться в Юникоде.

Замечания

Используйте этот макрос, чтобы определить, указана ли библиотека Common Controls функцию, указанную proc вместо вызова GetProcAddress. Этот макрос представляет собой версию Юникода AFX_COMCTL32_IF_EXISTS.

Требования

afxcomctl32.h, afxcomctl32.inl

DECLARE_DYNAMIC

Добавляет возможность доступа к сведениям о классе объекта во время выполнения при производных от класса CObject.

DECLARE_DYNAMIC(class_name)

Параметры

class_name
Фактическое имя класса.

Замечания

DECLARE_DYNAMIC Добавьте макрос в заголовок (.h) для класса, а затем включите этот модуль во все .cpp модули, которым требуется доступ к объектам этого класса.

При использовании макросов и макросов, как описано, можно использовать DECLARE_DYNAMIC RUNTIME_CLASS макрос и IMPLEMENT_DYNAMIC CObject::IsKindOf функцию для определения класса объектов во время выполнения.

Если DECLARE_DYNAMIC он включен в объявление класса, необходимо IMPLEMENT_DYNAMIC включить в реализацию класса.

Дополнительные сведения о макросе см. в разделах DECLARE_DYNAMIC CObject классов.

Пример

Пример см. в примере IMPLEMENT_DYNAMIC.

Требования

Заголовок: afx.h

DECLARE_DYNCREATE

Позволяет объектам производных CObjectклассов динамически создаваться во время выполнения.

DECLARE_DYNCREATE(class_name)

Параметры

class_name
Фактическое имя класса.

Замечания

Платформа использует эту возможность динамически создавать новые объекты. Например, новое представление, созданное при открытии нового документа. Классы документов, представлений и кадров должны поддерживать динамическое создание, так как платформа должна динамически создавать их.

DECLARE_DYNCREATE Добавьте макрос в модуль для класса, а затем включите этот модуль во .h все .cpp модули, которым требуется доступ к объектам этого класса.

Если DECLARE_DYNCREATE он включен в объявление класса, необходимо IMPLEMENT_DYNCREATE включить в реализацию класса.

Дополнительные сведения о макросе см. в разделах DECLARE_DYNCREATE CObject классов.

Примечание.

Макрос DECLARE_DYNCREATE включает все функциональные возможности DECLARE_DYNAMIC.

Пример

Пример см. в примере IMPLEMENT_DYNCREATE.

Требования

Заголовок: afx.h

DECLARE_OLECTLTYPE

GetUserTypeNameID Объявляет функции и GetMiscStatus члены класса элемента управления.

Синтаксис

DECLARE_OLECTLTYPE( class_name )

Параметры

class_name
Имя класса элемента управления.

Замечания

GetUserTypeNameID и GetMiscStatus являются чистыми виртуальными функциями, объявленными в COleControl. Так как эти функции являются чистыми виртуальными, они должны быть переопределены в классе управления. Кроме того DECLARE_OLECTLTYPE, необходимо добавить макрос в IMPLEMENT_OLECTLTYPE объявление класса элемента управления.

Требования

Заголовок: afxctl.h

DECLARE_PROPPAGEIDS

Объявляет, что элемент управления OLE предоставляет список страниц свойств для отображения его свойств.

Синтаксис

DECLARE_PROPPAGEIDS( class_name )

Параметры

class_name
Имя класса элемента управления, которому принадлежат страницы свойств.

Замечания

DECLARE_PROPPAGEIDS Используйте макрос в конце объявления класса. Затем в .cpp файле, определяющем функции-члены для класса, используйте BEGIN_PROPPAGEIDS макрос, записи макросов для каждой страницы свойств элемента управления и END_PROPPAGEIDS макрос, чтобы объявить конец списка страниц свойств.

Дополнительные сведения о страницах свойств см. в статье ActiveX Controls: Property Pages.

Требования

Заголовок: afxctl.h

DECLARE_SERIAL

Создает код заголовка C++, необходимый CObjectдля производного класса, который можно сериализовать.

DECLARE_SERIAL(class_name)

Параметры

class_name
Фактическое имя класса.

Замечания

Сериализация — это процесс записи или чтения содержимого объекта в файл и из него.

DECLARE_SERIAL Используйте макрос в .h модуле, а затем включите этот модуль во все .cpp модули, которым требуется доступ к объектам этого класса.

Если DECLARE_SERIAL он включен в объявление класса, необходимо IMPLEMENT_SERIAL включить в реализацию класса.

Макрос DECLARE_SERIAL включает все функциональные возможности DECLARE_DYNAMIC и DECLARE_DYNCREATE.

Макрос можно использовать AFX_API для автоматического CArchive экспорта оператора извлечения для классов, использующих DECLARE_SERIAL и IMPLEMENT_SERIAL макросы. Скобите объявления класса (расположенные .h в файле) со следующим кодом:

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

Дополнительные сведения о макросе см. в разделах DECLARE_SERIAL CObject классов.

Пример

class CAge : public CObject
{
public:
   void Serialize(CArchive& ar);
   DECLARE_SERIAL(CAge)

   // remainder of class declaration omitted

Требования

Заголовок: afx.h

IMPLEMENT_DYNAMIC

Создает код C++, необходимый для динамического CObjectпроизводного класса с доступом во время выполнения к имени класса и позиции в иерархии.

IMPLEMENT_DYNAMIC(class_name, base_class_name)

Параметры

class_name
Фактическое имя класса.

base_class_name
Имя базового класса.

Замечания

IMPLEMENT_DYNAMIC Используйте макрос в модуле.cpp, а затем свяжите полученный код объекта только один раз.

Дополнительные сведения см. в разделах CObjectклассов.

Пример

class CPerson : public CObject
{
   DECLARE_DYNAMIC(CPerson)

   // other declarations
};

 

IMPLEMENT_DYNAMIC(CPerson, CObject)

Требования

Заголовок: afx.h

IMPLEMENT_DYNCREATE

Позволяет динамически создавать объекты производных CObjectклассов во время выполнения при использовании с макросом DECLARE_DYNCREATE .

IMPLEMENT_DYNCREATE(class_name, base_class_name)

Параметры

class_name
Фактическое имя класса.

base_class_name
Фактическое имя базового класса.

Замечания

Платформа использует эту возможность динамически создавать новые объекты, например при чтении объекта с диска во время сериализации. IMPLEMENT_DYNCREATE Добавьте макрос в файл реализации класса. Дополнительные сведения см. в разделах CObjectклассов.

При использовании DECLARE_DYNCREATE макросов IMPLEMENT_DYNCREATE и макросов можно использовать RUNTIME_CLASS макрос и CObject::IsKindOf функцию-член, чтобы определить класс объектов во время выполнения.

Если DECLARE_DYNCREATE он включен в объявление класса, необходимо IMPLEMENT_DYNCREATE включить в реализацию класса.

Обратите внимание, что это определение макроса вызовет конструктор по умолчанию для класса. Если нетривиальный конструктор явно реализуется классом, он также должен явно реализовать конструктор по умолчанию. Конструктор по умолчанию можно добавить в разделы класса private или protected члены, чтобы предотвратить его вызов вне реализации класса.

Пример

class CMyDynCreateObj : public CObject
{
   int m_Num;
public:
   DECLARE_DYNCREATE(CMyDynCreateObj)
   CMyDynCreateObj(int Num) { m_Num = Num; }
private:
   CMyDynCreateObj() { m_Num = 0; }  // provide default constructor only for 
                                     // dynamic creation 
};

 

IMPLEMENT_DYNCREATE(CMyDynCreateObj, CObject)

Требования

Заголовок: afx.h

IMPLEMENT_OLECREATE_FLAGS

Этот макрос или IMPLEMENT_OLECREATE должен отображаться в файле реализации для любого класса, который использует DECLARE_OLECREATE.

Синтаксис

IMPLEMENT_OLECREATE_FLAGS( class_name, external_name, nFlags,
    l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)

Параметры

class_name
Фактическое имя класса.

external_name
Имя объекта, предоставленное другим приложениям (заключено в кавычки).

nFlags
Содержит один или несколько следующих флагов:

  • afxRegInsertable Позволяет элементу управления отображаться в диалоговом окне "Вставка объекта" для объектов OLE.
  • afxRegApartmentThreading Задает модель потоков в реестре ThreadingModel=Apartment.
  • afxRegFreeThreading Задает модель потоков в реестре ThreadingModel=Free.

Вы можете объединить два флага afxRegApartmentThreading и afxRegFreeThreading задать ThreadingModel=Оба. Дополнительные сведения о регистрации модели потоков см InprocServer32 . в пакете SDK для Windows.

l, w1w2, b4b5b6b2b3b1, b7b8 , компоненты CLSID класса.

Замечания

Примечание.

При использовании IMPLEMENT_OLECREATE_FLAGSможно указать, какая модель потоков поддерживает объект с помощью nFlags параметра. Если вы хотите поддерживать только однопотовую модель, используйте IMPLEMENT_OLECREATE.

Внешнее имя — это идентификатор, предоставляемый другим приложениям. Клиентские приложения используют внешнее имя для запроса объекта этого класса с сервера автоматизации.

Идентификатор класса OLE — это уникальный 128-разрядный идентификатор объекта. Он состоит из одного long, двух **WORD* и восьми *BYTE**s, как представлено l, w1w2и b1 через b8 описание синтаксиса. Мастер приложений и мастера кода создают уникальные идентификаторы классов OLE, необходимые для вас.

Требования

Заголовок: afxdisp.h

IMPLEMENT_OLECTLTYPE

GetUserTypeNameID Реализует функции и GetMiscStatus члены класса элемента управления.

Синтаксис

DECLARE_OLECTLTYPE( class_name, idsUserTypeName, dwOleMisc )

Параметры

class_name
Имя класса элемента управления.

idsUserTypeName
Идентификатор ресурса строки, содержащей внешнее имя элемента управления.

dwOleMisc
Перечисление, содержащее один или несколько флагов. Дополнительные сведения об этом перечислении см OLEMISC . в пакете SDK для Windows.

Замечания

Кроме того IMPLEMENT_OLECTLTYPE, необходимо добавить макрос в DECLARE_OLECTLTYPE объявление класса элемента управления.

Функция-член GetUserTypeNameID возвращает строку ресурса, которая идентифицирует класс элемента управления. GetMiscStatusOLEMISC возвращает биты для элемента управления. Это перечисление указывает коллекцию параметров, описывающих другие характеристики элемента управления. Полное описание OLEMISC параметров см OLEMISC . в пакете SDK для Windows.

Примечание.

Параметры по умолчанию, используемые элементом ActiveX ControlWizard: OLEMISC_ACTIVATEWHENVISIBLE, OLEMISC_SETCLIENTSITEFIRST, OLEMISC_INSIDEOUTи OLEMISC_CANTLINKINSIDEOLEMISC_RECOMPOSEONRESIZE.

Требования

Заголовок: afxctl.h

IMPLEMENT_SERIAL

Создает код C++, необходимый для динамического CObjectпроизводного класса с доступом во время выполнения к имени класса и позиции в иерархии.

IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)

Параметры

class_name
Фактическое имя класса.

base_class_name
Имя базового класса.

wSchema
Номер версии UINT, который будет закодирован в архиве, чтобы включить десериализацию программы для идентификации и обработки данных, созданных более ранними версиями программы. Номер схемы класса не должен иметь значение -1.

Замечания

IMPLEMENT_SERIAL Используйте макрос в .cpp модуле, а затем свяжите полученный код объекта только один раз.

Макрос можно использовать AFX_API для автоматического CArchive экспорта оператора извлечения для классов, использующих DECLARE_SERIAL и IMPLEMENT_SERIAL макросы. Скобите объявления класса (расположенные .h в файле) со следующим кодом:

#undef AFX_API
#define AFX_API AFX_EXT_CLASS

// <your class declarations here>

#undef AFX_API
#define AFX_API

Дополнительные сведения см. в разделах CObjectклассов.

Пример

IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)

Требования

Заголовок: afx.h

RUNTIME_CLASS

Возвращает структуру классов во время выполнения из имени класса C++.

RUNTIME_CLASS(class_name)

Параметры

class_name
Фактическое имя класса (не заключено в кавычки).

Замечания

RUNTIME_CLASS возвращает указатель на CRuntimeClass структуру для класса, указанного в class_name. Только CObjectпроизводные классы, объявленные с DECLARE_DYNAMIC, DECLARE_DYNCREATEили DECLARE_SERIAL возвращают указатели на структуру CRuntimeClass .

Дополнительные сведения см. в разделах CObjectклассов.

Пример

CRuntimeClass* prt = RUNTIME_CLASS(CAge);
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);

Требования

Заголовок: afx.h

DECLARE_OLECREATE

Позволяет создавать объекты производных CCmdTargetклассов с помощью автоматизации OLE.

DECLARE_OLECREATE(class_name)

Параметры

class_name
Фактическое имя класса.

Замечания

Этот макрос позволяет другим приложениям с поддержкой OLE создавать объекты этого типа.

DECLARE_OLECREATE Добавьте макрос в модуль для класса, а затем включите этот модуль во .h все .cpp модули, которым требуется доступ к объектам этого класса.

Если DECLARE_OLECREATE он включен в объявление класса, необходимо IMPLEMENT_OLECREATE включить в реализацию класса. Объявление класса, используемое также DECLARE_OLECREATE должно использовать DECLARE_DYNCREATE или DECLARE_SERIAL.

Требования

Заголовок: afxdisp.h

IMPLEMENT_OLECREATE

Этот макрос или IMPLEMENT_OLECREATE_FLAGS должен отображаться в файле реализации для любого класса, который использует DECLARE_OLECREATE.

IMPLEMENT_OLECREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)

Параметры

class_name
Фактическое имя класса.

external_name
Имя объекта, предоставленное другим приложениям (заключено в кавычки).

l, w1w2, b4b5b6b2b3b1, b7b8 , компоненты CLSID класса.

Замечания

Примечание.

При использовании IMPLEMENT_OLECREATEпо умолчанию поддерживается только одна модель потоков. При использовании IMPLEMENT_OLECREATE_FLAGSможно указать, какая модель потоков поддерживает объект с помощью nFlags параметра.

Внешнее имя — это идентификатор, предоставляемый другим приложениям. Клиентские приложения используют внешнее имя для запроса объекта этого класса с сервера автоматизации.

Идентификатор класса OLE — это уникальный 128-разрядный идентификатор объекта. Он состоит из одного long, двух **WORD* и восьми *BYTE**s, как представлено l, w1w2и b1 через b8 описание синтаксиса. Мастер приложений и мастера кода создают уникальные идентификаторы классов OLE, необходимые для вас.

Требования

Заголовок: afxdisp.h

См. также

Макросы и глобальные
Изоляция библиотеки общих элементов управления MFC
Ключ CLSID