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
Przestroga |
---|
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.
Co chcesz zrobić?
Wywóz z biblioteki DLL przy użyciu opcję __declspec(dllexport)
Funkcje C++ eksportu do użycia w plików wykonywalnych języka c
Funkcje c eksportu do użycia w c lub C++ języka plików wykonywalnych