2011-01-18 16 views
7

Ho avuto una domanda sulla creazione/collegamento di DLL in Visual Studio 2005 e versioni successive. Fondamentalmente la mia comprensione ed esperienza è questa:Visual Studio C++: quando dovrei usare __declspec (dllimport)?

Per creare una DLL, specifico le proprietà del progetto per creare una DLL, e quindi I __declspec (dllexport) davanti a qualsiasi funzione o membro che voglio esporre pubblicamente dal DLL. La costruzione del progetto comporterà una DLL, un Lib e un file di intestazione che può essere distribuito come ad esempio un'API o qualcosa del genere.

D'altra parte, per fare in modo che l'altra applicazione eseguibile compilata si colleghi in modo dinamico alla DLL e utilizzi le sue funzioni, è sufficiente che il progetto eseguibile includa i file di intestazione e il collegamento con il piccolo file lib creato quando il La DLL è stata creata Finché l'applicazione compilata riesce a trovare la DLL, tutto funzionerà.

Questa è stata la mia esperienza e questo è anche il modo in cui il tutorial di costruzione di Microsoft DLL ha descritto tutto su MSDN. Mi chiedo: è questa pratica standard? Quando avresti mai avuto bisogno di usare __declspec (dllimport) ovunque? Mi sto perdendo qualcosa?

Grazie!

+0

possibile duplicato di [Perché/quando __declspec (dllimport) non è necessario?] (Http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-non-needed) –

risposta

13

Sì, si utilizzerà __declspec (dllimport) e in genere si dispone di una macro che controlla se un file di origine esporta (se fa parte della DLL) o importa (se fa parte dei simboli using-executable).

nella DLL è possibile impostare una costante manifesta le impostazioni di generazione di qualche tipo, dire 'BUILDING_MY_DLL' e quindi creare la macro in questo modo all'interno del file di intestazione:

#ifdef BUILDING_MY_DLL 
#define MY_DLL_EXPORT __declspec(dllexport) 
#else 
#define MY_DLL_EXPORT __declspec(dllimport) 
#endif 

e poi decorare le funzioni esportate in questo modo:

MY_DLL_EXPORT int func(int y); 

è possibile anche esportare intere classi in questo modo anche:

class MY_DLL_EXPORT InterestingClass 
{ 
... 
}; 
+1

Ottima risposta, grazie! Ho dato un'occhiata al codice sorgente per alcune DLL e sembrano essere tutte progettate nel modo specificato. Mi stavo ancora chiedendo, perché questo MSDN Microsoft tutorial codice scappa senza usare __declspec (dllimport)? -> http://msdn.microsoft.com/en-us/library/ms235636.aspx – Russel

+3

@Russel: dllimport non è richiesto, ma penso che sia la soluzione migliore. Vedere questo: http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed – trojanfoe

+0

Vedere [Dynamic-Link Libraries] (https://msdn.microsoft.com/en-us /library/windows/desktop/ms682589(v=vs.85).aspx) e [Procedura dettagliata: creazione e utilizzo di una libreria di collegamento dinamico (C++)] (https://msdn.microsoft.com/en-us/library/ ms235636 (v = vs.140) .aspx). Tutto questo è spiegato più ampiamente in quelli. Il mio [Static contro Dynamic Linking] (http://simplesamples.info/Beginners/StaticVersusDynamic.aspx) potrebbe aiutare un po '. – user34660

Problemi correlati