Delen via


Exporteren en importeren met AFX_EXT_CLASS

MFC-extensie-DLL's gebruiken de macro-AFX_EXT_CLASS om klassen te exporteren; de uitvoerbare bestanden die zijn gekoppeld aan het DLL-bestand met de MFC-extensie, gebruiken de macro om klassen te importeren. Met de AFX_EXT_CLASS macro kunnen dezelfde headerbestanden die worden gebruikt om de MFC-extensie-DLL te bouwen, worden gebruikt met de uitvoerbare bestanden die aan het DLL-bestand zijn gekoppeld.

Voeg in het headerbestand voor uw DLL het AFX_EXT_CLASS trefwoord als volgt toe aan de declaratie van uw klasse:

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

Deze macro wordt door MFC gedefinieerd als __declspec(dllexport) wanneer de preprocessorsymbolen _AFXDLL worden gedefinieerd en _AFXEXT worden gedefinieerd. Maar de macro wordt gedefinieerd als __declspec(dllimport) wanneer _AFXDLL gedefinieerd is en _AFXEXT niet is gedefinieerd. Wanneer dit is gedefinieerd, geeft het preprocessorsymbool _AFXDLL aan dat de gedeelde versie van MFC wordt gebruikt door het uitvoerbare doelbestand (een DLL of een toepassing). Wanneer zowel _AFXDLL als _AFXEXT gedefinieerd zijn, geeft dit aan dat het uitvoerbare bestand een MFC-extensie-DLL is.

Omdat AFX_EXT_CLASS wordt gedefinieerd als __declspec(dllexport) bij het exporteren vanuit een MFC-extensie-DLL, kunt u hele klassen exporteren zonder de versierde namen voor alle symbolen van die klasse in het .def-bestand te plaatsen.

Hoewel u met deze methode het maken van een .def-bestand en alle versierde namen voor de klasse kunt vermijden, is het efficiënter om een .def-bestand te maken omdat de namen op volgorde kunnen worden geëxporteerd. Als u de .def-bestandsmethode voor het exporteren wilt gebruiken, plaatst u de volgende code aan het begin en einde van het headerbestand:

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

Waarschuwing

Wees voorzichtig bij het exporteren van inlinefuncties, omdat ze de mogelijkheid van versieconflicten kunnen creëren. Een inlinefunctie wordt uitgebreid naar de toepassingscode; Als u de functie later herschrijft, wordt deze daarom niet bijgewerkt, tenzij de toepassing zelf opnieuw wordt gecompileerd. Normaal gesproken kunnen DLL-functies worden bijgewerkt zonder de toepassingen opnieuw te bouwen die ze gebruiken.

Afzonderlijke leden in een klasse exporteren

Soms wilt u mogelijk afzonderlijke leden van uw klas exporteren. Als u bijvoorbeeld een CDialog-afgeleide klasse exporteert, hoeft u mogelijk alleen de constructor en de DoModal aanroep te exporteren. U kunt deze gebruiken AFX_EXT_CLASS voor de afzonderlijke leden die u wilt exporteren.

Voorbeeld:

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

Omdat u niet langer alle leden van de klasse exporteert, kan er een extra probleem optreden vanwege de manier waarop MFC-macro's werken. Verschillende helpermacro's van MFC declareren of definiëren gegevensleden. Daarom moeten deze gegevensleden ook worden geëxporteerd uit uw DLL.

De macro wordt bijvoorbeeld als volgt gedefinieerd bij het DECLARE_DYNAMIC bouwen van een MFC-extensie-DLL:

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

De regel die begint met "static AFX_DATA" verklaart een statisch object in uw klasse. Als u deze klasse correct wilt exporteren en toegang wilt krijgen tot de runtimegegevens van een uitvoerbaar clientbestand, moet u dit statische object exporteren. Omdat het statische object wordt gedeclareerd met de wijzigingsfunctie AFX_DATA, hoeft u AFX_DATA alleen te definiëren wanneer u uw DLL bouwt en het als __declspec(dllexport) te definiëren bij het bouwen van het uitvoerbare clientbestand. Omdat AFX_EXT_CLASS op deze manier al is gedefinieerd, hoeft u alleen maar opnieuw te definiëren AFX_DATA om hetzelfde te zijn als AFX_EXT_CLASS rond uw klassedefinitie.

Voorbeeld:

#undef  AFX_DATA
#define AFX_DATA AFX_EXT_CLASS

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

#undef  AFX_DATA
#define AFX_DATA

Omdat MFC altijd het AFX_DATA symbool gebruikt voor gegevensitems die in de macro's worden gedefinieerd, werkt deze techniek voor dergelijke scenario's. Het werkt bijvoorbeeld voor DECLARE_MESSAGE_MAP.

Opmerking

Als u de hele klasse exporteert in plaats van geselecteerde leden van de klasse, worden statische gegevensleden automatisch geëxporteerd.

Wat u wilt doen?

Waar wil je meer over weten?

Zie ook

Exporteren vanuit een DLL