Determinare il metodo di esportazione da usare
È possibile esportare le funzioni in due modi, ovvero un file con estensione def o la __declspec(dllexport)
parola chiave . Per aiutarti a decidere quale sia il modo migliore per la DLL, prendi in considerazione queste domande:
Si prevede di esportare altre funzioni in un secondo momento?
La DLL viene usata solo dalle applicazioni che è possibile ricompilare o viene usata dalle applicazioni che non è possibile ricompilare, ad esempio le applicazioni create da terze parti?
Vantaggi e svantaggi dell'uso di file con estensione def
L'esportazione di funzioni in un file con estensione def consente di controllare gli ordinali di esportazione. Quando si aggiunge una funzione esportata alla DLL, è possibile assegnargli un valore ordinale superiore rispetto a qualsiasi altra funzione esportata. Quando si esegue questa operazione, le applicazioni che usano il collegamento implicito non devono ricollegarsi alla libreria di importazione che contiene la nuova funzione. Questo è molto pratico se si progetta una DLL per l'uso da parte di molte applicazioni perché è possibile aggiungere nuove funzionalità e anche assicurarsi che continui a funzionare correttamente con le applicazioni che già si basano su di esso. Ad esempio, le DLL MFC vengono compilate usando i file con estensione def.
Un altro vantaggio dell'uso di un file con estensione def è che è possibile usare l'attributo NONAME
per esportare una funzione. In questo modo viene inserita solo l'ordinale nella tabella delle esportazioni nella DLL. Per le DLL con un numero elevato di funzioni esportate, l'uso dell'attributo NONAME
può ridurre le dimensioni del file DLL. Per informazioni su come scrivere un'istruzione di definizione del modulo, vedere Regole per istruzioni Module-Definition. Per informazioni sull'esportazione ordinale, vedere Esportazione di funzioni da una DLL per ordinale anziché per nome.
Uno svantaggio dell'uso di un file con estensione def è che se si esportano funzioni in un file C++, è necessario inserire i nomi decorati nel file con estensione def o definire le funzioni esportate usando extern "C" per evitare la decorazione del nome eseguita dal compilatore MSVC.
Se si inseriscono i nomi decorati nel file con estensione def, è possibile ottenerli usando lo strumento DUMPBIN o usando l'opzione linker /MAP . I nomi decorati prodotti dal compilatore sono specifici del compilatore; pertanto, se si inseriscono i nomi decorati generati dal compilatore in un file con estensione def, le applicazioni collegate alla DLL devono essere compilate anche usando la stessa versione del compilatore in modo che i nomi decorati nell'applicazione chiamante corrispondano ai nomi esportati nel file con estensione def della DLL.
Vantaggi e svantaggi dell'uso di __declspec(dllexport)
L'uso __declspec(dllexport)
è pratico perché non è necessario preoccuparsi di gestire un file con estensione def e ottenere i nomi decorati delle funzioni esportate. Tuttavia, l'utilità di questo modo di esportazione è limitata dal numero di applicazioni collegate che si è disposti a ricompilare. Se si ricompila la DLL con nuove esportazioni, è necessario ricompilare anche le applicazioni perché i nomi decorati per le funzioni C++ esportate potrebbero cambiare se si usa una versione diversa del compilatore per ricompilarla.
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++