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)