Esportazione e importazione tramite AFX_EXT_CLASS

Le DLL dell'estensione MFC usano la macro AFX_EXT_CLASS per esportare le classi. I file eseguibili collegati alla DLL dell'estensione MFC usano la macro per importare le classi. Con la macro AFX_EXT_CLASS , è possibile usare gli stessi file di intestazione usati per compilare la DLL dell'estensione MFC con i file eseguibili che si collegano alla DLL.

Nel file di intestazione per la DLL aggiungere la parola chiave AFX_EXT_CLASS alla dichiarazione della classe come indicato di seguito:

class AFX_EXT_CLASS CMyClass : public CDocument
{
// <body of class>
};

Questa macro viene definita da MFC come __declspec(dllexport) quando vengono definiti i _AFXDLL simboli del preprocessore e _AFXEXT . Tuttavia, la macro viene definita come __declspec(dllimport) quando _AFXDLL è definita e _AFXEXT non è definita. Se definito, il simbolo _AFXDLL del preprocessore indica che la versione condivisa di MFC viene usata dal file eseguibile di destinazione (una DLL o un'applicazione). Quando vengono definiti sia _AFXDLL che _AFXEXT , indica che l'eseguibile di destinazione è una DLL di estensione MFC.

Poiché AFX_EXT_CLASS viene definito come durante __declspec(dllexport) l'esportazione da una DLL di estensione MFC, è possibile esportare intere classi senza inserire i nomi decorati per tutti i simboli della classe nel file def.

Sebbene sia possibile evitare di creare un file con estensione def e tutti i nomi decorati per la classe con questo metodo, la creazione di un file con estensione def è più efficiente perché i nomi possono essere esportati dall'ordinale. Per usare il metodo di esportazione del file def, inserire il codice seguente all'inizio e alla fine del file di intestazione:

#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA

Attenzione

Prestare attenzione quando si esportano funzioni inline, perché possono creare la possibilità di conflitti di versione. Una funzione inline viene espansa nel codice dell'applicazione; pertanto, se successivamente si riscrive la funzione, non viene aggiornata a meno che l'applicazione stessa non venga ricompilata. In genere, le funzioni DLL possono essere aggiornate senza ricompilare le applicazioni che le usano.

Esportazione di singoli membri in una classe

In alcuni casi potrebbe essere necessario esportare singoli membri della classe. Ad esempio, se si esporta una CDialogclasse derivata da , potrebbe essere necessario esportare solo il costruttore e la DoModal chiamata. È possibile usare AFX_EXT_CLASS nei singoli membri da esportare.

Ad esempio:

class CExampleDialog : public CDialog
{
public:
   AFX_EXT_CLASS CExampleDialog();
   AFX_EXT_CLASS int DoModal();
   ...
   // rest of class definition
   ...
};

Poiché non si esportano più tutti i membri della classe, è possibile che si verifichi un problema aggiuntivo a causa del funzionamento delle macro MFC. Diverse macro helper di MFC dichiarano o definiscono effettivamente i membri dati. Pertanto, questi membri di dati devono essere esportati anche dalla DLL.

Ad esempio, la DECLARE_DYNAMIC macro viene definita come segue quando si compila una DLL di estensione MFC:

#define DECLARE_DYNAMIC(class_name) \
protected: \
   static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
   static AFX_DATA CRuntimeClass class##class_name; \
   virtual CRuntimeClass* GetRuntimeClass() const; \

La riga che inizia con static sta dichiarando un oggetto statico AFX_DATA all'interno della classe. Per esportare correttamente questa classe e accedere alle informazioni di runtime da un eseguibile client, è necessario esportare questo oggetto statico. Poiché l'oggetto statico viene dichiarato con il modificatore AFX_DATA, è sufficiente definire AFX_DATA per la __declspec(dllexport) compilazione della DLL e definirlo come __declspec(dllimport) durante la compilazione del file eseguibile client. Poiché AFX_EXT_CLASS è già definito in questo modo, è sufficiente ridefinire AFX_DATA per essere uguale AFX_EXT_CLASS alla definizione della classe.

Ad esempio:

#undef  AFX_DATA
#define AFX_DATA AFX_EXT_CLASS

class CExampleView : public CView
{
   DECLARE_DYNAMIC()
   // ... class definition ...
};

#undef  AFX_DATA
#define AFX_DATA

Poiché MFC usa sempre il AFX_DATA simbolo sugli elementi di dati definiti all'interno delle relative macro, questa tecnica funziona per tutti questi scenari. Ad esempio, funziona per DECLARE_MESSAGE_MAP.

Nota

Se si esporta l'intera classe anziché i membri selezionati della classe, i membri dati statici vengono esportati automaticamente.

Cosa vuoi fare?

Scegliere l'argomento su cui visualizzare maggiori informazioni

Vedi anche

Esportazione da una DLL