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 CDialog
tří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?
Export funkcí jazyka C++ pro použití ve spustitelných souborech jazyka C
Export funkcí jazyka C pro použití ve spustitelných souborech jazyka C nebo C++
Import do aplikace s použitím deklarace __declspec(dllimport)