2010-02-20 21 views
6
#ifndef _DLL_TUTORIAL_H_ 
#define _DLL_TUTORIAL_H_ 
#include <iostream> 

#if defined DLL_EXPORT 
#define DECLDIR __declspec(dllexport) 
#else 
#define DECLDIR __declspec(dllimport) 
#endif 

extern "C" 
{ 
    DECLDIR int Add(int a, int b); 
    DECLDIR void Function(void); 
} 

#endif 

¿Qué hace realmente el código DECLDIR __declspec(dllexport)?¿Qué hace realmente el código "DECLDIR __declspec (dllexport)"?

+1

@deepak: ¡Bienvenido a 'StackOverflow'! He formateado tu código (selecciónalo y presiona Ctrl + K). –

Respuesta

1

Define la constante de macro DECLDIR como __declspec(dllexport). dllexport es para exportar funciones desde archivos DLL. He aquí una cita de this page:

Estos atributos definen explícitamente la interfaz de DLL a su cliente, que puede ser el archivo ejecutable o DLL otra . Declarar funciones como dllexport elimina la necesidad de un archivo de definición de módulo (.DEF), al menos con respecto a la especificación de funciones exportadas. Tenga en cuenta que dllexport reemplaza la palabra clave __export.

Si una clase está marcada declspec (dllexport), cualquier especializaciones de plantillas de clase en la jerarquía de clases son implícitamente marcado como declspec (dllexport). Esta significa que las plantillas están explícitamente instanciadas y sus miembros deben ser definidos.

__declspec, por cierto, es explained here.

8

En el mundo de Microsoft, __declspec(dllexport) hace que una función o clase se llame desde fuera de la DLL.

Cuando crea una DLL, de forma predeterminada, cualquier función definida en la DLL solo se puede llamar desde la misma DLL. No puede llamar a esa función desde un archivo ejecutable o una DLL diferente.

Si desea que se llame a su función desde fuera de la DLL, debe exportarla agregando __declspec(dllexport).

Una manera de pensarlo es que __declspec(dllexport) es una función que forma parte de la interfaz pública de una DLL.

Si bien no preguntó por __declspec(dllimport) que es todo lo contrario. Al invocar una función en una DLL diferente, su DLL necesita saber que es parte de una interfaz pública de DLL diferente para que pueda manejar la llamada correctamente (llamar a una función en una DLL diferente requiere un código más complejo que llame a una función en usted).

+0

Esto es mucho más claro. – thezhaba

+0

Gracias por tan agradable y fácil explicación – spt025

Cuestiones relacionadas