Udostępnij za pośrednictwem


Eksportowanie i importowanie przy użyciu AFX_EXT_CLASS

Biblioteki DLL rozszerzenia użyć makra AFX_EXT_CLASS do eksportowania klas; pliki wykonywalne, które łącze do biblioteki DLL rozszerzenia użyć makra do importowania klas.Z AFX_EXT_CLASS makro, tych samych plików nagłówka, które są używane do budowania rozszerzenie DLL może być używany z plików wykonywalnych, które łącza do biblioteki DLL.

W pliku nagłówka dla biblioteki DLL, należy 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 opcję __declspec(dllexport) podczas symboli preprocesora _AFXDLL i _AFXEXT są zdefiniowane.Ale makro jest zdefiniowana jako __declspec(dllimport) po _AFXDLL jest zdefiniowana i _AFXEXT nie jest zdefiniowany.Po zdefiniowaniu symboli preprocesora _AFXDLL wskazuje, że udostępnioną wersję MFC jest używany przez docelowego pliku wykonywalnego (biblioteki DLL lub aplikacji).Gdy zarówno _AFXDLL i _AFXEXT są zdefiniowane, to oznacza, że docelowego pliku wykonywalnego jest rozszerzeniem DLL.

Ponieważ AFX_EXT_CLASS jest zdefiniowana jako opcję __declspec(dllexport) podczas eksportowania z rozszerzeniem DLL, bez wprowadzania nazwy dekoracyjne wszystkie symbole tej klasy w pliku .def, można wyeksportować całej klasy.Ta metoda jest używana przez próbkę MFC DLLHUSK.

Chociaż można uniknąć tworzenia pliku .def i wszystkie nazwy dekoracyjne klasy z tej metody, utworzenie pliku .def jest bardziej efektywne, ponieważ nazwy mogą być eksportowane przez wartość porządkową.Aby użyć metody eksportowania pliku .def, 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 wbudowanej funkcji, ponieważ mogą one tworzyć możliwości konfliktów wersji.Funkcji śródwierszowej pobiera rozwinięta w kodzie aplikacji; w związku z tym Jeśli później ponownie napisać funkcję, to nie zostanie zaktualizowany, chyba że jest ponownie kompilowana samej aplikacji.Normalnie funkcje biblioteki DLL mogą być aktualizowane bez odbudowa 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 wywołania.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żna uruchomić dodatkowe problem ze względu na sposób tej pracy makra MFC.Kilka makra pomocnika MFC firmy faktycznie zadeklarować lub definiowania danych członków.W związku z tym członkowie tych danych muszą zostać wywiezione z biblioteki DLL.

Na przykład DECLARE_DYNAMIC makro jest zdefiniowany następująco Konstruując biblioteki DLL rozszerzenia:

#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ę od static AFX_DATA jest zadeklarowanie obiektu statycznego wewnątrz klasy użytkownika.Poprawnie wyeksportować tej klasy i uzyskać dostęp do informacji czasu z pliku wykonywalnego klienta, należy wyeksportować obiektu statycznego.Ponieważ obiekt statyczny jest zadeklarowana z modyfikatorem AFX_DATA, musisz zdefiniować AFX_DATA za opcję __declspec(dllexport) Konstruując biblioteki DLL i zdefiniowanie go jako __declspec(dllimport) podczas konstruowania klient programu wykonywalnego.Ponieważ AFX_EXT_CLASS jest już zdefiniowana w ten sposób, wystarczy zmienić definicję AFX_DATA być taka sama, jak AFX_EXT_CLASS wokół definicji klasy użytkownika.

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ż MFC zawsze używa AFX_DATA symbol na elementy danych definiuje w makrach, ta technika działa dla wszystkich takich scenariuszy.Na przykład działa dla DECLARE_MESSAGE_MAP.

[!UWAGA]

Jeśli eksportujesz całej klasy, a nie wybrane składniki klasy automatycznie eksportowane są dane statyczne członków.

9xyb5w93.collapse_all(pl-pl,VS.110).gifCo chcesz zrobić?

9xyb5w93.collapse_all(pl-pl,VS.110).gifCo chcesz wiedzieć więcej?

Zobacz też

Koncepcje

Eksportowanie z biblioteki DLL