Eksportowanie i importowanie przy użyciu makra AFX_EXT_CLASS
Biblioteki DLL rozszerzenia , należy użyć makra AFX_EXT_CLASS do wyeksportowania klasy; pliki wykonywalne, połączonych z biblioteki DLL rozszerzenia należy użyć makra do importowania klas.Z AFX_EXT_CLASS makro, te same pliki nagłówka, które są używane do tworzenia rozszerzenie DLL może być używany z plików wykonywalnych, które łącza do biblioteki DLL.
W pliku nagłówka dla biblioteki DLL, dodać AFX_EXT_CLASS słowo kluczowe, aby deklaracja klasy, w następujący sposób:
class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};
To makro jest zdefiniowany przez MFC jako __declspec(dllexport) podczas symboli preprocesora _AFXDLL i _AFXEXT są zdefiniowane.Ale makro jest zdefiniowany jako __declspec(dllimport) po _AFXDLL jest zdefiniowana i _AFXEXT nie jest zdefiniowana.Po zdefiniowaniu preprocesora symbol _AFXDLL wskazuje, że udostępniona wersja biblioteki MFC jest używana przez obiekt docelowy pliku wykonywalnego (bibliotekę DLL lub aplikacji).Gdy obie _AFXDLL i _AFXEXT są zdefiniowane, to oznacza, że miejsce docelowe pliku wykonywalnego jest biblioteka DLL rozszerzenia.
Ponieważ AFX_EXT_CLASS jest zdefiniowana jako __declspec(dllexport) w przypadku wywozu z biblioteki DLL rozszerzenia, bez umieszczania dekoracyjną nazwy dla wszystkich symboli tej klasy w pliku o rozszerzeniu def można wyeksportować całymi klasami.Ta metoda jest używana przez próbkę MFC DLLHUSK.
Chociaż można uniknąć tworzenia pliku o rozszerzeniu def i wszystkie nazwy dekoracyjną dla klasy przy użyciu tej metody, tworząc plik o rozszerzeniu def jest bardziej efektywne, ponieważ nazwy mogą być eksportowane przez porządkowych.Aby zastosować metodę pliku o rozszerzeniu def wywozu, należy umieścić następujący kod, na początku i na końcu pliku nagłówka:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA
Przestroga |
---|
Należy zachować ostrożność, podczas eksportowania wbudowane funkcje, ponieważ mogą one tworzyć możliwości konfliktów wersji.Wbudowanej funkcji pobiera rozwinięte w kodzie aplikacji; w związku z tym jeśli później przepisywania funkcji, to nie zostanie zaktualizowany, chyba że sama aplikacja jest ponownie kompilowana.Normalnie funkcje biblioteki DLL mogą być aktualizowane bez przebudowy aplikacje, które ich używają. |
Eksportowanie poszczególnych członków w klasie
Czasami można wyeksportować poszczególnych członków swojej klasy.Na przykład, jeśli eksportujesz CDialog-klasy, może być tylko należy wyeksportować konstruktora i DoModal zadzwonić.Można użyć AFX_EXT_CLASS na poszczególnych członków, należy wyeksportować.
Na przykład:
class CExampleDialog : public CDialog
{
public:
AFX_EXT_CLASS CExampleDialog();
AFX_EXT_CLASS int DoModal();
...
// rest of class definition
...
};
Ponieważ wszyscy członkowie klasy nie są eksportowane, możesz napotkać dodatkowy problem ze względu na sposób pracy makra MFC.Kilka makr pomocnika MFC faktycznie zadeklarować lub definiowania danych członków.W związku z tym członkowie ci danych muszą zostać wywiezione z biblioteki DLL.
Na przykład DECLARE_DYNAMIC Konstruując biblioteki DLL rozszerzenia makro jest zdefiniowana w następujący sposób:
#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static AFX_DATA CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const; \
Wiersz rozpoczynający się statyczne AFX_DATA jest zadeklarowanie statycznego obiektu wewnątrz klasy.Aby eksportować tej klasy poprawnie i dostęp do informacji wykonywalna z pliku wykonywalnego klienta, należy wyeksportować ten obiekt statyczny.Ponieważ obiekt statyczny jest zadeklarowana z modyfikatorem AFX_DATA, trzeba zdefiniować AFX_DATA za __declspec(dllexport) Konstruując biblioteki DLL i zdefiniować ją jako __declspec(dllimport) podczas tworzenia pliku wykonywalnego klienta.Ponieważ AFX_EXT_CLASS jest już zdefiniowany w ten sposób, wystarczy zmienić definicję AFX_DATA tak samo, jak AFX_EXT_CLASS wokół swojej definicji klasy.
Na przykład:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_CLASS
class CExampleView : public CView
{
DECLARE_DYNAMIC()
// ... class definition ...
};
#undef AFX_DATA
#define AFX_DATA
Ponieważ zawsze używa MFC AFX_DATA symbol na elementy danych definiuje w makrach, ta technika działa dla wszystkich takich scenariuszy.Na przykład, to działa na DECLARE_MESSAGE_MAP.
[!UWAGA]
Jeśli eksportujesz całej klasy, a nie wybranych elementów członkowskich klasy automatycznie eksportowane są dane statyczne członków.
Co chcesz zrobić?
Eksportuj funkcje C++ do użycia w plikach wykonywalnych w języku C
Eksportuj funkcje C do użycia w plikach wykonywalnych w języku C++ lub C