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 CObjectl’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 CObjectclasse 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 CObjectavec 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 CObjectl’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 sur ThreadingModel=Apartment.
  • afxRegFreeThreading Définit le modèle de thread dans le Registre sur ThreadingModel=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, , w1b2b3b1w2b5b6b4, b7composants 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, w2et 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_SETCLIENTSITEFIRSTOLEMISC_INSIDEOUT, , OLEMISC_CANTLINKINSIDEet 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 CObjectavec 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 CObjectles classes dérivées déclarées avec DECLARE_DYNAMIC, DECLARE_DYNCREATEou 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 CCmdTargetAutomation.

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, , w1b2b3b1w2b5b6b4, b7composants 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, w2et 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