Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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?
C++-functies exporteren voor gebruik in uitvoerbare bestanden in de C-taal
C-functies exporteren voor gebruik in uitvoerbare bestanden in C- of C++-taal
Importeren in een toepassing met behulp van __declspec(dllimport)