2011-01-18 10 views
7

Tuve una pregunta acerca de la creación/vinculación de DLL en Visual Studio 2005 y versiones posteriores. Básicamente, mi comprensión y experiencia es la siguiente:Visual Studio C++: ¿Cuándo debería estar utilizando __declspec (dllimport)?

Para construir una DLL, especifico las propiedades del proyecto para construir una DLL, y luego, pero __declspec (dllexport) frente a cualquier función o miembro que quiera exponer públicamente desde el DLL. La construcción del proyecto dará como resultado una DLL, una Lib y un archivo de encabezado que se puede implementar como, por ejemplo, una API o algo así.

En el otro extremo, para que su otra aplicación ejecutable compilada se vincule dinámicamente a la DLL y use sus funciones, simplemente necesita que su proyecto ejecutable incluya los archivos de encabezado y enlace con el pequeño archivo lib que se creó cuando DLL fue construido. Mientras la aplicación compilada pueda encontrar el archivo DLL, todo funcionará.

Esa ha sido mi experiencia y así es como el tutorial de creación de DLL de Microsoft describió todo en MSDN. Me pregunto: ¿es esta práctica estándar? ¿Cuándo necesitarías usar __declspec (dllimport) en algún lugar? ¿Me estoy perdiendo de algo?

Gracias!

+0

posible duplicado de [¿Por qué/cuándo es __declspec (dllimport) no es necesario?] (Http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed) –

Respuesta

13

Sí, utilizaría __declspec (dllimport) y generalmente tiene una macro que controla si un archivo fuente exporta (si es parte de su DLL) o importa (si es parte de los símbolos using-executable).

En su DLL se puede establecer una constante de manifiesto a los valores de creación de algún tipo, decir 'BUILDING_MY_DLL' y luego crear la macro como esta dentro de su archivo de cabecera:

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

y luego decorar sus funciones exportadas de esta manera:

MY_DLL_EXPORT int func(int y); 

también puede exportar clases enteras de esta manera también:

class MY_DLL_EXPORT InterestingClass 
{ 
... 
}; 
+1

¡Excelente respuesta, gracias! Eché un vistazo a la fuente de algunas DLL y todas parecen estar diseñadas de la manera que usted especificó. Todavía me preguntaba, ¿por qué este código de tutorial de Microsoft MSDN se escapa sin usar __declspec (dllimport)? -> http://msdn.microsoft.com/en-us/library/ms235636.aspx – Russel

+3

@Russel: dllimport no es obligatorio, pero creo que es una buena práctica. Consulte esto: http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed – trojanfoe

+0

Consulte [Bibliotecas de enlaces dinámicos] (https://msdn.microsoft.com/en-us /library/windows/desktop/ms682589(v=vs.85).aspx) y [Tutorial: Crear y usar una biblioteca de vínculos dinámicos (C++)] (https://msdn.microsoft.com/en-us/library/ ms235636 (v = vs.140) .aspx). Todo esto se explica más ampliamente en aquellos. Mi [Enlace estático versus dinámico] (http://simplesamples.info/Beginners/StaticVersusDynamic.aspx) podría ayudar un poco. – user34660

Cuestiones relacionadas