Sdílet prostřednictvím


Export a import pomocí třídy AFX_EXT_CLASS

Knihovny DLL rozšíření MFC používají makro AFX_EXT_CLASS k exportu tříd. Spustitelné soubory, které odkazují na knihovnu DLL rozšíření MFC, používají makro k importu tříd. Se AFX_EXT_CLASS makrem lze použít stejné soubory hlaviček, které se používají k sestavení knihovny DLL rozšíření MFC, se spustitelnými soubory, které odkazují na knihovnu DLL.

Do souboru záhlaví knihovny DLL přidejte klíčové slovo AFX_EXT_CLASS do deklarace třídy následujícím způsobem:

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

Toto makro je definováno prostředím MFC, jako __declspec(dllexport) když jsou definovány symboly preprocesoru a _AFXEXT jsou definovány_AFXDLL. Makro je ale definováno tak, jak __declspec(dllimport)_AFXDLL je definováno a _AFXEXT není definováno. Pokud je definovaný, symbol _AFXDLL preprocesoru označuje, že cílovou spustitelného souboru (knihovnu DLL nebo aplikaci) používá sdílená verze knihovny MFC. Pokud jsou definovány obě _AFXDLL a _AFXEXT jsou definovány, znamená to, že cílový spustitelný soubor je knihovna DLL rozšíření MFC.

Vzhledem k tomu AFX_EXT_CLASS , že je definován jako __declspec(dllexport) při exportu z knihovny DLL rozšíření MFC, můžete exportovat celé třídy bez umístění zdobených názvů pro všechny symboly této třídy v souboru .def.

I když se můžete vyhnout vytvoření souboru .def a všech dekorovaných názvů pro třídu pomocí této metody, vytvoření souboru .def je efektivnější, protože názvy lze exportovat podle řad. Pokud chcete použít metodu exportu souboru .def, umístěte na začátek a konec souboru hlavičky následující kód:

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

Upozornění

Při exportu vložených funkcí buďte opatrní, protože můžou vytvořit možnost konfliktů verzí. Vložená funkce se rozšíří do kódu aplikace; proto, pokud později přepíšete funkci, nebude aktualizována, pokud aplikace sama není rekompilována. Za normálních okolností lze aktualizovat funkce knihovny DLL bez opětovného sestavení aplikací, které je používají.

Export jednotlivých členů ve třídě

Někdy můžete chtít exportovat jednotlivé členy předmětu. Pokud například exportujete -odvozenou CDialogtřídu, možná budete muset exportovat pouze konstruktor a DoModal volání. Můžete použít AFX_EXT_CLASS jednotlivé členy, které potřebujete exportovat.

Příklad:

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

Vzhledem k tomu, že už neexportujete všechny členy třídy, můžete narazit na další problém, protože makra MFC fungují. Několik pomocných maker mfc ve skutečnosti deklaruje nebo definuje datové členy. Proto musí být tyto datové členy také exportovány z knihovny DLL.

Makro je například DECLARE_DYNAMIC definováno následujícím způsobem při vytváření rozšiřující knihovny DLL mfc:

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

Čára, která začíná statickou AFX_DATA , deklaruje statický objekt uvnitř vaší třídy. Chcete-li exportovat tuto třídu správně a získat přístup k informacím za běhu ze spustitelného souboru klienta, je nutné exportovat tento statický objekt. Vzhledem k tomu, že statický objekt je deklarován modifikátorem AFX_DATA, je nutné definovat AFX_DATA__declspec(dllexport) pouze při sestavování knihovny DLL a definovat ho jako __declspec(dllimport) při sestavování spustitelného souboru klienta. Protože AFX_EXT_CLASS je již definován tímto způsobem, stačí předefinovat AFX_DATA , aby byla stejná jako AFX_EXT_CLASS u definice třídy.

Příklad:

#undef  AFX_DATA
#define AFX_DATA AFX_EXT_CLASS

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

#undef  AFX_DATA
#define AFX_DATA

Vzhledem k tomu, že MFC vždy používá AFX_DATA symbol u datových položek, které definuje v rámci maker, tato technika funguje pro všechny takové scénáře. Například funguje pro DECLARE_MESSAGE_MAP.

Poznámka

Pokud exportujete celou třídu místo vybraných členů třídy, statické datové členy se automaticky exportují.

Co chcete udělat?

O čem chcete vědět víc?

Viz také

Export z knihovny DLL