Esportazione da una DLL tramite __declspec(dllexport)
Aggiornamento: novembre 2007
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 generazione.
Per esportare le funzioni, la parola chiave __declspec(dllexport) deve comparire a sinistra della parola chiave della convenzione di chiamata, se specificata. Ad 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 ... };
Quando si genera 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.
![]() |
---|
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)