Exportation et importation à l'aide de AFX_EXT_CLASS

Les DLL d’extension MFC utilisent la macro AFX_EXT_CLASS pour exporter des classes ; les exécutables liés à la DLL d’extension MFC utilisent la macro pour importer des classes. Avec la macro AFX_EXT_CLASS , les mêmes fichiers d’en-tête utilisés pour générer la DLL d’extension MFC peuvent être utilisés avec les exécutables liés à la DLL.

Dans le fichier d’en-tête de votre DLL, ajoutez le AFX_EXT_CLASS mot clé à la déclaration de votre classe comme suit :

class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};

Cette macro est définie par MFC comme __declspec(dllexport) lorsque les symboles _AFXDLL de préprocesseur et _AFXEXT sont définis. Mais la macro est définie comme __declspec(dllimport) lorsqu’elle _AFXDLL est définie et _AFXEXT n’est pas définie. Lorsqu’il est défini, le symbole _AFXDLL de préprocesseur indique que la version partagée de MFC est utilisée par l’exécutable cible (une DLL ou une application). Lorsque les deux _AFXDLL et _AFXEXT sont définis, cela indique que l’exécutable cible est une DLL d’extension MFC.

Comme AFX_EXT_CLASS il est défini comme __declspec(dllexport) lors de l’exportation à partir d’une DLL d’extension MFC, vous pouvez exporter des classes entières sans placer les noms décorés pour tous les symboles de cette classe dans le fichier .def.

Bien que vous puissiez éviter de créer un fichier .def et tous les noms décorés pour la classe avec cette méthode, la création d’un fichier .def est plus efficace, car les noms peuvent être exportés par ordinal. Pour utiliser la méthode de fichier .def d’exportation, placez le code suivant au début et à la fin de votre fichier d’en-tête :

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Attention

Veillez à exporter des fonctions inline, car elles peuvent créer la possibilité de conflits de version. Une fonction inline est développée dans le code de l’application ; par conséquent, si vous réécritez ultérieurement la fonction, elle n’est pas mise à jour, sauf si l’application elle-même est recompilée. Normalement, les fonctions DLL peuvent être mises à jour sans regénérer les applications qui les utilisent.

Exportation de membres individuels dans une classe

Parfois, vous souhaiterez peut-être exporter des membres individuels de votre classe. Par exemple, si vous exportez une CDialogclasse dérivée de -, vous devrez peut-être exporter uniquement le constructeur et l’appel DoModal . Vous pouvez utiliser AFX_EXT_CLASS sur les membres individuels que vous devez exporter.

Par exemple :

class CExampleDialog : public CDialog
{
public:
   AFX_EXT_CLASS CExampleDialog();
   AFX_EXT_CLASS int DoModal();
   ...
   // rest of class definition
   ...
};

Étant donné que vous n’exportez plus tous les membres de la classe, vous pouvez rencontrer un problème supplémentaire en raison de la façon dont fonctionnent les macros MFC. Plusieurs macros d’assistance de MFC déclarent ou définissent des membres de données. Par conséquent, ces membres de données doivent également être exportés à partir de votre DLL.

Par exemple, la macro est définie comme suit lors de la DECLARE_DYNAMIC génération d’une DLL d’extension MFC :

#define DECLARE_DYNAMIC(class_name) \
protected: \
   static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
   static AFX_DATA CRuntimeClass class##class_name; \
   virtual CRuntimeClass* GetRuntimeClass() const; \

La ligne qui commence par static AFX_DATA déclare un objet statique à l’intérieur de votre classe. Pour exporter cette classe correctement et accéder aux informations d’exécution à partir d’un exécutable client, vous devez exporter cet objet statique. Étant donné que l’objet statique est déclaré avec le modificateur AFX_DATA, vous devez uniquement définir AFX_DATA pour être __declspec(dllexport) lors de la génération de votre DLL et le définir comme __declspec(dllimport) lors de la génération de votre exécutable client. Étant donné qu’elle AFX_EXT_CLASS est déjà définie de cette façon, vous devez simplement redéfinir AFX_DATA pour être identique à celle de AFX_EXT_CLASS votre définition de classe.

Par exemple :

#undef  AFX_DATA
#define AFX_DATA AFX_EXT_CLASS

class CExampleView : public CView
{
   DECLARE_DYNAMIC()
   // ... class definition ...
};

#undef  AFX_DATA
#define AFX_DATA

Étant donné que MFC utilise toujours le AFX_DATA symbole sur les éléments de données qu’il définit dans ses macros, cette technique fonctionne pour tous ces scénarios. Par exemple, il fonctionne pour DECLARE_MESSAGE_MAP.

Remarque

Si vous exportez la classe entière plutôt que les membres sélectionnés de la classe, les membres de données statiques sont automatiquement exportés.

Que voulez-vous faire ?

Sur quels éléments souhaitez-vous obtenir des informations supplémentaires ?

Voir aussi

Exportation à partir d’une DLL