Services du modèle objet au moment de l'exécution
Les classes CObject
et CRuntimeClass
encapsulent plusieurs services d’objet, notamment l’accès aux informations de classe d’exécution, la sérialisation et la création d’objets dynamiques. Toutes les classes dérivées de CObject
héritent de cette fonctionnalité.
L'accès aux informations sur la classe d'exécution vous permet de déterminer les informations sur une classe d'objets au moment de l'exécution. La capacité de déterminer la classe d'un objet au moment de l'exécution est utile lorsque vous avez besoin de vérifications de type supplémentaires d'arguments de fonction et lorsque vous devez écrire un code spécial en fonction de la classe d'un objet. Les informations de classe d’exécution ne sont pas prises en charge directement par le langage C++.
La sérialisation est le processus d'écriture ou de lecture du contenu d'un objet vers et à partir d'un fichier. Vous pouvez utiliser la sérialisation pour stocker le contenu d'un objet même après que l'application se termine. L'objet peut ensuite être lu à partir du fichier lorsque l'application est redémarrée. De tels objets de données sont dits "persistants".
La création d'objets dynamique permet de créer un objet d'une classe spécifiée au moment de l'exécution. Par exemple, les objets document, vue et frame doivent prendre en charge la création dynamique car le framework doit les créer dynamiquement.
Le tableau suivant répertorie les macros MFC qui prennent en charge les informations relatives à la classe au moment de l'exécution, la sérialisation et la création dynamique.
Pour plus d’informations sur ces services d’objet d’exécution et la sérialisation, consultez l’article CObject
Class : Accès aux informations de classe d’exécution.
Macros des services du modèle objet au moment de l'exécution
Nom | Description |
---|---|
DECLARE_DYNAMIC |
Permet d'accéder aux informations sur la classe d'exécution (doit être utilisé dans la déclaration de classe). |
DECLARE_DYNCREATE |
Permet la création dynamique et l'accès aux informations sur la classe d'exécution (doit être utilisé dans la déclaration de classe). |
DECLARE_SERIAL |
Permet la sérialisation dynamique et l'accès aux informations sur la classe d'exécution (doit être utilisé dans la déclaration de classe). |
IMPLEMENT_DYNAMIC |
Permet d'accéder aux informations sur la classe d'exécution (doit être utilisé dans l'implémentation de classe). |
IMPLEMENT_DYNCREATE |
Permet la création dynamique et l'accès aux informations sur la classe d'exécution (doit être utilisé dans l'implémentation de classe). |
IMPLEMENT_SERIAL |
Permet la sérialisation et l'accès aux informations sur la classe d'exécution (doit être utilisé dans l'implémentation de classe). |
RUNTIME_CLASS |
Retourne la structure CRuntimeClass qui correspond à la classe nommée. |
OLE requiert souvent la création dynamique des objets au moment de l'exécution. Par exemple, une application serveur OLE doit pouvoir créer des éléments OLE dynamiquement en réponse à la demande d'un client. De même, un serveur Automation doit être en mesure de créer des éléments en réponse aux demandes des clients Automation.
La bibliothèque MFC fournit deux macros spécifiques à OLE.
Création dynamique des objets OLE
Nom | Description |
---|---|
AFX_COMCTL32_IF_EXISTS |
Détermine si la bibliothèque Common Controls implémente l’API spécifiée. |
AFX_COMCTL32_IF_EXISTS2 |
Détermine si la bibliothèque Common Controls implémente l’API spécifiée. |
DECLARE_OLECREATE |
Active les objets à créer par l'intermédiaire de OLE Automation. |
DECLARE_OLECTLTYPE |
Déclare les fonctions membres et GetMiscStatus les GetUserTypeNameID fonctions de votre classe de contrôle. |
DECLARE_PROPPAGEIDS |
Déclare que le contrôle OLE fournit une liste de pages de propriétés pour afficher ses propriétés. |
IMPLEMENT_OLECREATE |
Active les objets à créer par le système OLE. |
IMPLEMENT_OLECTLTYPE |
Implémente les GetUserTypeNameID fonctions membres de GetMiscStatus votre classe de contrôle. |
IMPLEMENT_OLECREATE_FLAGS |
Cette macro ou IMPLEMENT_OLECREATE doit apparaître dans le fichier d’implémentation pour toute classe qui utilise DECLARE_OLECREATE . |
AFX_COMCTL32_IF_EXISTS
Détermine si la bibliothèque Common Controls implémente l’API spécifiée.
Syntaxe
AFX_COMCTL32_IF_EXISTS( proc );
Paramètres
proc
Pointeur vers une chaîne terminée par null contenant le nom de la fonction ou spécifie la valeur ordinale de la fonction. Si ce paramètre est une valeur ordinale, il doit être dans le mot de bas ordre ; le mot de haut ordre doit être égal à zéro. Ce paramètre doit être dans Unicode.
Notes
Utilisez cette macro pour déterminer si la bibliothèque Common Controls de la fonction spécifiée par proc
(au lieu d’appeler GetProcAddress
.
Spécifications
afxcomctl32.h
, afxcomctl32.inl
AFX_COMCTL32_IF_EXISTS2
Détermine si la bibliothèque Common Controls implémente l’API spécifiée (il s’agit de la version Unicode de AFX_COMCTL32_IF_EXISTS
).
Syntaxe
AFX_COMCTL32_IF_EXISTS2( proc );
Paramètres
proc
Pointeur vers une chaîne terminée par null contenant le nom de la fonction ou spécifie la valeur ordinale de la fonction. Si ce paramètre est une valeur ordinale, il doit être dans le mot de bas ordre ; le mot de haut ordre doit être égal à zéro. Ce paramètre doit être dans Unicode.
Notes
Utilisez cette macro pour déterminer si la bibliothèque Common Controls de la fonction spécifiée par proc
(au lieu d’appeler GetProcAddress
. Cette macro est la version Unicode de AFX_COMCTL32_IF_EXISTS
.
Spécifications
afxcomctl32.h
, afxcomctl32.inl
DECLARE_DYNAMIC
Ajoute la possibilité d’accéder aux informations d’exécution sur la classe d’un objet lors de la dérivation d’une classe à partir de CObject
.
DECLARE_DYNAMIC(class_name)
Paramètres
class_name
Nom réel de la classe.
Notes
Ajoutez la DECLARE_DYNAMIC
macro au module d’en-tête (.h
) de la classe, puis incluez ce module dans tous les .cpp
modules qui ont besoin d’accéder aux objets de cette classe.
Si vous utilisez les macros et les DECLARE_DYNAMIC
macros comme décrit, vous pouvez ensuite utiliser la RUNTIME_CLASS
macro et la CObject::IsKindOf
fonction pour déterminer la classe de vos objets au moment de l’exécutionIMPLEMENT_DYNAMIC
.
Si DECLARE_DYNAMIC
elle est incluse dans la déclaration de classe, elle IMPLEMENT_DYNAMIC
doit être incluse dans l’implémentation de classe.
Pour plus d’informations sur la macro, consultezCObject
Rubriques sur la DECLARE_DYNAMIC
classe.
Exemple
Consultez l’exemple pour IMPLEMENT_DYNAMIC
.
Spécifications
En-tête : afx.h
DECLARE_DYNCREATE
Permet aux objets de classes dérivées de créer dynamiquement au moment de CObject
l’exécution.
DECLARE_DYNCREATE(class_name)
Paramètres
class_name
Nom réel de la classe.
Notes
L’infrastructure utilise cette possibilité de créer dynamiquement de nouveaux objets. Par exemple, la nouvelle vue créée lorsque vous ouvrez un nouveau document. Les classes document, affichage et frame doivent prendre en charge la création dynamique, car l’infrastructure doit les créer dynamiquement.
Ajoutez la DECLARE_DYNCREATE
macro dans le .h
module pour la classe, puis incluez ce module dans tous les .cpp
modules qui ont besoin d’accéder aux objets de cette classe.
Si DECLARE_DYNCREATE
elle est incluse dans la déclaration de classe, elle IMPLEMENT_DYNCREATE
doit être incluse dans l’implémentation de classe.
Pour plus d’informations sur la macro, consultezCObject
Rubriques sur la DECLARE_DYNCREATE
classe.
Remarque
La DECLARE_DYNCREATE
macro inclut toutes les fonctionnalités de DECLARE_DYNAMIC
.
Exemple
Consultez l’exemple pour IMPLEMENT_DYNCREATE
.
Spécifications
En-tête : afx.h
DECLARE_OLECTLTYPE
Déclare les fonctions membres et GetMiscStatus
les GetUserTypeNameID
fonctions de votre classe de contrôle.
Syntaxe
DECLARE_OLECTLTYPE( class_name )
Paramètres
class_name
Nom de la classe de contrôle.
Notes
GetUserTypeNameID
et GetMiscStatus
sont des fonctions virtuelles pures, déclarées dans COleControl
. Étant donné que ces fonctions sont virtuelles pures, elles doivent être remplacées dans votre classe de contrôle. En plus de DECLARE_OLECTLTYPE
, vous devez ajouter la IMPLEMENT_OLECTLTYPE
macro à votre déclaration de classe de contrôle.
Spécifications
En-tête : afxctl.h
DECLARE_PROPPAGEIDS
Déclare que le contrôle OLE fournit une liste de pages de propriétés pour afficher ses propriétés.
Syntaxe
DECLARE_PROPPAGEIDS( class_name )
Paramètres
class_name
Nom de la classe de contrôle qui possède les pages de propriétés.
Notes
Utilisez la DECLARE_PROPPAGEIDS
macro à la fin de votre déclaration de classe. Ensuite, dans le .cpp
fichier qui définit les fonctions membres de la classe, utilisez la BEGIN_PROPPAGEIDS
macro, les entrées de macro pour chacune des pages de propriétés de votre contrôle et la END_PROPPAGEIDS
macro pour déclarer la fin de la liste des pages de propriétés.
Pour plus d’informations sur les pages de propriétés, consultez l’article Contrôles ActiveX : Pages de propriétés.
Spécifications
En-tête : afxctl.h
DECLARE_SERIAL
Génère le code d’en-tête C++ nécessaire pour une CObject
classe dérivée qui peut être sérialisée.
DECLARE_SERIAL(class_name)
Paramètres
class_name
Nom réel de la classe.
Notes
La sérialisation est le processus d’écriture ou de lecture du contenu d’un objet vers et à partir d’un fichier.
Utilisez la DECLARE_SERIAL
macro dans un .h
module, puis incluez ce module dans tous les .cpp
modules qui ont besoin d’accéder aux objets de cette classe.
Si DECLARE_SERIAL
elle est incluse dans la déclaration de classe, elle IMPLEMENT_SERIAL
doit être incluse dans l’implémentation de classe.
La DECLARE_SERIAL
macro inclut toutes les fonctionnalités de DECLARE_DYNAMIC
et DECLARE_DYNCREATE
.
Vous pouvez utiliser la AFX_API
macro pour exporter automatiquement l’opérateur CArchive
d’extraction pour les classes qui utilisent les macros et IMPLEMENT_SERIAL
les DECLARE_SERIAL
macros. Crochetez les déclarations de classe (situées dans le .h
fichier) avec le code suivant :
#undef AFX_API
#define AFX_API AFX_EXT_CLASS
// <your class declarations here>
#undef AFX_API
#define AFX_API
Pour plus d’informations sur la macro, consultezCObject
Rubriques sur la DECLARE_SERIAL
classe.
Exemple
class CAge : public CObject
{
public:
void Serialize(CArchive& ar);
DECLARE_SERIAL(CAge)
// remainder of class declaration omitted
Spécifications
En-tête : afx.h
IMPLEMENT_DYNAMIC
Génère le code C++ nécessaire pour une classe dérivée dynamique CObject
avec un accès au moment de l’exécution au nom et à la position de la classe dans la hiérarchie.
IMPLEMENT_DYNAMIC(class_name, base_class_name)
Paramètres
class_name
Nom réel de la classe.
base_class_name
Nom de la classe de base.
Notes
Utilisez la IMPLEMENT_DYNAMIC
macro dans un .cpp
module, puis liez le code objet résultant une seule fois.
Pour plus d’informations, consultez CObject
Rubriques sur la classe.
Exemple
class CPerson : public CObject
{
DECLARE_DYNAMIC(CPerson)
// other declarations
};
IMPLEMENT_DYNAMIC(CPerson, CObject)
Spécifications
En-tête : afx.h
IMPLEMENT_DYNCREATE
Permet aux objets de classes dérivées -d’être créés dynamiquement au moment de CObject
l’exécution lorsqu’ils sont utilisés avec la DECLARE_DYNCREATE
macro.
IMPLEMENT_DYNCREATE(class_name, base_class_name)
Paramètres
class_name
Nom réel de la classe.
base_class_name
Nom réel de la classe de base.
Notes
L’infrastructure utilise cette possibilité de créer dynamiquement de nouveaux objets, par exemple lorsqu’il lit un objet à partir d’un disque pendant la sérialisation. Ajoutez la IMPLEMENT_DYNCREATE
macro dans le fichier d’implémentation de classe. Pour plus d’informations, consultez CObject
Rubriques sur la classe.
Si vous utilisez les macros et les DECLARE_DYNCREATE
macros, vous pouvez ensuite utiliser la RUNTIME_CLASS
macro et la CObject::IsKindOf
fonction membre pour déterminer la classe de vos objets au moment de l’exécutionIMPLEMENT_DYNCREATE
.
Si DECLARE_DYNCREATE
elle est incluse dans la déclaration de classe, elle IMPLEMENT_DYNCREATE
doit être incluse dans l’implémentation de classe.
Notez que cette définition de macro appelle le constructeur par défaut pour votre classe. Si un constructeur non trivial est explicitement implémenté par la classe, il doit également implémenter explicitement le constructeur par défaut. Le constructeur par défaut peut être ajouté aux sections membres ou protected
de private
la classe pour empêcher son appel en dehors de l’implémentation de classe.
Exemple
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)
Spécifications
En-tête : afx.h
IMPLEMENT_OLECREATE_FLAGS
Cette macro ou IMPLEMENT_OLECREATE
doit apparaître dans le fichier d’implémentation pour toute classe qui utilise DECLARE_OLECREATE
.
Syntaxe
IMPLEMENT_OLECREATE_FLAGS( class_name, external_name, nFlags,
l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Paramètres
class_name
Nom réel de la classe.
external_name
Nom de l’objet exposé à d’autres applications (entre guillemets).
nFlags
Contient un ou plusieurs des indicateurs suivants :
afxRegInsertable
Permet au contrôle d’apparaître dans la boîte de dialogue Insérer un objet pour les objets OLE.afxRegApartmentThreading
Définit le modèle de thread dans le Registre surThreadingModel=Apartment
.afxRegFreeThreading
Définit le modèle de thread dans le Registre surThreadingModel=Free
.
Vous pouvez combiner les deux indicateurs afxRegApartmentThreading
et afxRegFreeThreading
définir ThreadingModel=Both. Pour plus d’informations sur l’inscription de modèle de thread, consultez InprocServer32
le Kit de développement logiciel (SDK) Windows.
l
, , w1
b2
b3
b1
w2
b5
b6
b4
, b7
composants b8
du CLSID de la classe.
Notes
Remarque
Si vous utilisez IMPLEMENT_OLECREATE_FLAGS
, vous pouvez spécifier le modèle de thread pris en charge par votre objet à l’aide du nFlags
paramètre. Si vous souhaitez prendre en charge uniquement le modèle monoreading, utilisez IMPLEMENT_OLECREATE
.
Le nom externe est l’identificateur exposé à d’autres applications. Les applications clientes utilisent le nom externe pour demander un objet de cette classe à partir d’un serveur Automation.
L’ID de classe OLE est un identificateur 128 bits unique pour l’objet. Il se compose d’un long
, deux **WORD
**s et huit **BYTE
**s, tels que représentés par l
, w1
, w2
et b1
à travers b8
dans la description de la syntaxe. L’Assistant Application et les Assistants de code créent des ID de classe OLE uniques pour vous en fonction des besoins.
Spécifications
En-tête : afxdisp.h
IMPLEMENT_OLECTLTYPE
Implémente les GetUserTypeNameID
fonctions membres de GetMiscStatus
votre classe de contrôle.
Syntaxe
DECLARE_OLECTLTYPE( class_name, idsUserTypeName, dwOleMisc )
Paramètres
class_name
Nom de la classe de contrôle.
idsUserTypeName
ID de ressource d’une chaîne contenant le nom externe du contrôle.
dwOleMisc
Énumération contenant un ou plusieurs indicateurs. Pour plus d’informations sur cette énumération, consultez OLEMISC
le Kit de développement logiciel (SDK) Windows.
Notes
En plus de IMPLEMENT_OLECTLTYPE
, vous devez ajouter la DECLARE_OLECTLTYPE
macro à votre déclaration de classe de contrôle.
La GetUserTypeNameID
fonction membre retourne la chaîne de ressource qui identifie votre classe de contrôle. GetMiscStatus
retourne les OLEMISC
bits de votre contrôle. Cette énumération spécifie une collection de paramètres décrivant diverses caractéristiques de votre contrôle. Pour obtenir une description complète des OLEMISC
paramètres, consultez OLEMISC
le Kit de développement logiciel (SDK) Windows.
Remarque
Les paramètres par défaut utilisés par activeX ControlWizard sont les suivants : OLEMISC_ACTIVATEWHENVISIBLE
, , OLEMISC_SETCLIENTSITEFIRST
OLEMISC_INSIDEOUT
, , OLEMISC_CANTLINKINSIDE
et OLEMISC_RECOMPOSEONRESIZE
.
Spécifications
En-tête : afxctl.h
IMPLEMENT_SERIAL
Génère le code C++ nécessaire pour une classe dérivée dynamique CObject
avec un accès au moment de l’exécution au nom et à la position de la classe dans la hiérarchie.
IMPLEMENT_SERIAL(class_name, base_class_name, wSchema)
Paramètres
class_name
Nom réel de la classe.
base_class_name
Nom de la classe de base.
wSchema
Un « numéro de version » UINT qui sera encodé dans l’archive pour permettre à un programme de désérialisation d’identifier et de gérer les données créées par les versions antérieures du programme. Le numéro de schéma de classe ne doit pas être -1.
Notes
Utilisez la IMPLEMENT_SERIAL
macro dans un .cpp
module , puis liez le code objet obtenu une seule fois.
Vous pouvez utiliser la AFX_API
macro pour exporter automatiquement l’opérateur CArchive
d’extraction pour les classes qui utilisent les macros et IMPLEMENT_SERIAL
les DECLARE_SERIAL
macros. Crochetez les déclarations de classe (situées dans le .h
fichier) avec le code suivant :
#undef AFX_API
#define AFX_API AFX_EXT_CLASS
// <your class declarations here>
#undef AFX_API
#define AFX_API
Pour plus d’informations, consultez les rubriques de classe.CObject
Exemple
IMPLEMENT_SERIAL(CAge, CObject, VERSIONABLE_SCHEMA | 2)
Spécifications
En-tête : afx.h
RUNTIME_CLASS
Obtient la structure de classe runtime à partir du nom d’une classe C++.
RUNTIME_CLASS(class_name)
Paramètres
class_name
Nom réel de la classe (non placé entre guillemets).
Notes
RUNTIME_CLASS
retourne un pointeur vers une CRuntimeClass
structure pour la classe spécifiée par class_name
. Seules CObject
les classes dérivées déclarées avec DECLARE_DYNAMIC
, DECLARE_DYNCREATE
ou DECLARE_SERIAL
retournent des pointeurs vers une CRuntimeClass
structure.
Pour plus d’informations, consultez CObject
Rubriques sur la classe.
Exemple
CRuntimeClass* prt = RUNTIME_CLASS(CAge);
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
Spécifications
En-tête : afx.h
DECLARE_OLECREATE
Permet de créer des objets de classes dérivées par le biais d’OLE CCmdTarget
Automation.
DECLARE_OLECREATE(class_name)
Paramètres
class_name
Nom réel de la classe.
Notes
Cette macro permet à d’autres applications compatibles OLE de créer des objets de ce type.
Ajoutez la DECLARE_OLECREATE
macro dans le .h
module pour la classe, puis incluez ce module dans tous les .cpp
modules qui ont besoin d’accéder aux objets de cette classe.
Si DECLARE_OLECREATE
elle est incluse dans la déclaration de classe, elle IMPLEMENT_OLECREATE
doit être incluse dans l’implémentation de classe. Une déclaration de classe utilisant DECLARE_OLECREATE
doit également utiliser DECLARE_DYNCREATE
ou DECLARE_SERIAL
.
Spécifications
En-tête : afxdisp.h
IMPLEMENT_OLECREATE
Cette macro ou IMPLEMENT_OLECREATE_FLAGS
doit apparaître dans le fichier d’implémentation pour toute classe qui utilise DECLARE_OLECREATE
.
IMPLEMENT_OLECREATE(class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Paramètres
class_name
Nom réel de la classe.
external_name
Nom de l’objet exposé à d’autres applications (entre guillemets).
l
, , w1
b2
b3
b1
w2
b5
b6
b4
, b7
composants b8
du CLSID de la classe.
Notes
Remarque
Si vous utilisez IMPLEMENT_OLECREATE
, par défaut, vous ne prenez en charge que le modèle de thread unique. Si vous utilisez IMPLEMENT_OLECREATE_FLAGS
, vous pouvez spécifier le modèle de thread pris en charge par votre objet à l’aide du nFlags
paramètre.
Le nom externe est l’identificateur exposé à d’autres applications. Les applications clientes utilisent le nom externe pour demander un objet de cette classe à partir d’un serveur Automation.
L’ID de classe OLE est un identificateur 128 bits unique pour l’objet. Il se compose d’un long
, deux **WORD
**s et huit **BYTE
**s, tels que représentés par l
, w1
, w2
et b1
à travers b8
dans la description de la syntaxe. L’Assistant Application et les Assistants de code créent des ID de classe OLE uniques pour vous en fonction des besoins.
Spécifications
En-tête : afxdisp.h
Voir aussi
Macros et globals
Isolement de la bibliothèque de contrôles communs MFC
Clé CLSID