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
Informacje dotyczące przestrogiPrzestroga

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ć?

O czym chcesz się dowiedzieć więcej?

Zobacz też

Koncepcje

Eksportowanie z biblioteki DLL