Esportazione da una DLL tramite __declspec(dllexport)
Nella versione a 16 bit del compilatore di Microsoft Visual C++ è stata introdotta la parola chiave __export per consentire la generazione automatica dei nomi di esportazione e il relativo posizionamento in un file lib, che può quindi essere utilizzato come un normale file lib statico per il collegamento a una DLL.
Nelle versioni più recenti del compilatore è possibile esportare dati, funzioni, classi o funzioni membro delle classi da una DLL mediante la parola chiave __declspec(dllexport), che aggiunge la direttiva di esportazione al file oggetto per evitare di dover utilizzare un file def.
L'utilità di questa parola chiave è evidente quando si tenta di esportare i nomi decorati di funzioni C++. Dato che non esiste alcuna specifica standard per la decorazione dei nomi, il nome di una funzione esportata può variare tra le diverse versioni del compilatore. Se si utilizza __declspec(dllexport), la ricompilazione della DLL e dei file exe dipendenti è necessaria solo per tenere conto di eventuali modifiche delle convenzioni di denominazione.
Molte direttive di esportazione, come i numeri ordinali, NONAME e PRIVATE, possono essere definite solo in un file def e non è possibile specificare questi attributi senza un file def. L'utilizzo di __declspec(dllexport) insieme a un file def, tuttavia, non causa errori di compilazione.
Per esportare le funzioni, la parola chiave __declspec(dllexport) deve comparire a sinistra della parola chiave della convenzione di chiamata, se specificata. Di seguito è riportato un esempio:
__declspec(dllexport) void __cdecl Function1(void);
Per esportare tutte le funzioni membro e i membri dati pubblici di una classe, la parola chiave deve comparire a sinistra del nome della classe come indicato di seguito:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
Nota
Impossibile applicare __declspec(dllexport) a una funzione con la convenzione di chiamata __clrcall.
Quando si compila la DLL, in genere viene creato un file di intestazione contenente i prototipi di funzione e/o le classi esportate e viene aggiunta la parola chiave __declspec(dllexport) alle dichiarazioni nel file di intestazione. Per rendere il codice più leggibile, definire una macro per __declspec(dllexport), quindi utilizzarla con ciascun simbolo da esportare:
#define DllExport __declspec( dllexport )
__declspec(dllexport) memorizza i nomi di funzione nella tabella di esportazione della DLL. Per ottimizzare le dimensioni della tabella, vedere Esportazione di funzioni da una DLL in base al numero ordinale anziché al nome.
Nota
Quando si esegue il porting del codice sorgente della DLL da Win16 a Win32, sostituire ogni istanza di __export con __declspec(dllexport).
Come riferimento, esaminare il file di intestazione Winbase.h di Win32, che contiene esempi di utilizzo di __declspec(dllimport).
Scegliere l'argomento con cui si desidera procedere
Esportazione di funzioni C++ per l'utilizzo in eseguibili in linguaggio C
Esportazione di funzioni C per l'utilizzo in eseguibili in linguaggio C o C++
Importazione in un'applicazione utilizzando __declspec(dllimport)