Службы модели объекта во время выполнения
Классы 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
, w1
w2
, b4
b5
b6
b2
b3
b1
, b7
b8
, компоненты CLSID класса.
Замечания
Примечание.
При использовании IMPLEMENT_OLECREATE_FLAGS
можно указать, какая модель потоков поддерживает объект с помощью nFlags
параметра. Если вы хотите поддерживать только однопотовую модель, используйте IMPLEMENT_OLECREATE
.
Внешнее имя — это идентификатор, предоставляемый другим приложениям. Клиентские приложения используют внешнее имя для запроса объекта этого класса с сервера автоматизации.
Идентификатор класса OLE — это уникальный 128-разрядный идентификатор объекта. Он состоит из одного long
, двух **WORD
* и восьми *BYTE
**s, как представлено l
, w1
w2
и 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
возвращает строку ресурса, которая идентифицирует класс элемента управления. GetMiscStatus
OLEMISC
возвращает биты для элемента управления. Это перечисление указывает коллекцию параметров, описывающих другие характеристики элемента управления. Полное описание OLEMISC
параметров см OLEMISC
. в пакете SDK для Windows.
Примечание.
Параметры по умолчанию, используемые элементом ActiveX ControlWizard: OLEMISC_ACTIVATEWHENVISIBLE
, OLEMISC_SETCLIENTSITEFIRST
, OLEMISC_INSIDEOUT
и OLEMISC_CANTLINKINSIDE
OLEMISC_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
, w1
w2
, b4
b5
b6
b2
b3
b1
, b7
b8
, компоненты CLSID класса.
Замечания
Примечание.
При использовании IMPLEMENT_OLECREATE
по умолчанию поддерживается только одна модель потоков. При использовании IMPLEMENT_OLECREATE_FLAGS
можно указать, какая модель потоков поддерживает объект с помощью nFlags
параметра.
Внешнее имя — это идентификатор, предоставляемый другим приложениям. Клиентские приложения используют внешнее имя для запроса объекта этого класса с сервера автоматизации.
Идентификатор класса OLE — это уникальный 128-разрядный идентификатор объекта. Он состоит из одного long
, двух **WORD
* и восьми *BYTE
**s, как представлено l
, w1
w2
и b1
через b8
описание синтаксиса. Мастер приложений и мастера кода создают уникальные идентификаторы классов OLE, необходимые для вас.
Требования
Заголовок: afxdisp.h
См. также
Макросы и глобальные
Изоляция библиотеки общих элементов управления MFC
Ключ CLSID