Esportazione da una DLL tramite i file DEF
Un file di definizione del modulo o DEF (*.def) è un file di testo contenente una o più istruzioni del modulo che descrivono vari attributi di una DLL. Se non si usa la __declspec(dllexport)
parola chiave per esportare le funzioni della DLL, la DLL richiede un file DEF.
Un file DEF minimo deve contenere le istruzioni di definizione del modulo seguenti:
La prima istruzione nel file deve essere l'istruzione LIBRARY. Questa istruzione identifica il file DEF come appartenente a una DLL. L'istruzione LIBRARY è seguita dal nome della DLL. Il linker inserisce questo nome nella libreria di importazione della DLL.
L'istruzione EXPORTS elenca i nomi e, facoltativamente, i valori ordinali delle funzioni esportate dalla DLL. Per assegnare alla funzione un valore ordinale, seguire il nome della funzione con un segno (@) e un numero. Quando si specificano valori ordinali, devono trovarsi nell'intervallo compreso tra 1 e N, dove N è il numero di funzioni esportate dalla DLL. Per esportare le funzioni in base all'ordinale, vedere Esportazione di funzioni da una DLL per ordinale anziché per nome e questo argomento.
Ad esempio, una DLL contenente il codice per implementare un albero di ricerca binario potrebbe essere simile alla seguente:
LIBRARY BTREE
EXPORTS
Insert @1
Delete @2
Member @3
Min @4
Se si usa la Creazione guidata DLL MFC per creare una DLL MFC, la procedura guidata crea automaticamente uno scheletro di file DEF e lo aggiunge automaticamente al progetto. Aggiungere i nomi delle funzioni da esportare in questo file. Per le DLL non MFC, creare manualmente il file DEF e aggiungerlo al progetto. Passare quindi a Project>Properties>Linker Input Module Definition File (File di definizione del modulo di input>del linker>) e immettere il nome del file DEF. Ripetere questo passaggio per ogni configurazione e piattaforma oppure eseguire tutte le operazioni contemporaneamente selezionando Configurazione = Tutte le configurazioni e Piattaforma = Tutte le piattaforme.
Se si esportano funzioni in un file C++, è necessario inserire i nomi decorati nel file DEF o definire le funzioni esportate con collegamento C standard usando extern "C". Se è necessario inserire i nomi decorati nel file DEF, è possibile ottenerli usando lo strumento DUMPBIN o usando l'opzione linker /MAP . Si noti che i nomi decorati prodotti dal compilatore sono specifici del compilatore. Se si inseriscono i nomi decorati prodotti dal compilatore Microsoft C++ (MSVC) in un file DEF, le applicazioni collegate alla DLL devono essere compilate anche usando la stessa versione di MSVC in modo che i nomi decorati nell'applicazione chiamante corrispondano ai nomi esportati nel file DEF della DLL.
Nota
Una DLL compilata con Visual Studio 2015 può essere utilizzata dalle applicazioni compilate con Visual Studio 2017 o Visual Studio 2019.
Se si sta compilando una DLL di estensione ed esportando usando un file DEF, inserire il codice seguente all'inizio e alla fine dei file di intestazione che contengono le classi esportate:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// <body of your header file>
#undef AFX_DATA
#define AFX_DATA
Queste righe assicurano che le variabili MFC usate internamente o aggiunte alle classi vengano esportate (o importate) dalla DLL dell'estensione MFC. Ad esempio, quando si deriva una classe usando DECLARE_DYNAMIC
, la macro si espande per aggiungere una CRuntimeClass
variabile membro alla classe. L'uscita da queste quattro righe potrebbe causare la compilazione o il collegamento della DLL in modo errato o causare un errore quando l'applicazione client si collega alla DLL.
Quando si compila la DLL, il linker usa il file DEF per creare un file di esportazione (con estensione exp) e un file di libreria di importazione (lib). Il linker usa quindi il file di esportazione per compilare il file DLL. Eseguibili che si collegano in modo implicito al collegamento dll alla libreria di importazione al momento della compilazione.
Si noti che MFC usa i file DEF per esportare funzioni e classi dal MFCx0.dll.
Cosa vuoi fare?
Esportare le funzioni C++ per l'uso nei file eseguibili in linguaggio C
Esportare le funzioni C da usare nei file eseguibili in linguaggio C o C++