2009-09-07 20 views
6

Estoy en una necesidad urgente de ayuda, necesito administrar una dependencia de aplicación en Visual Studio. La aplicación vincula a una DLL solo en una versión específica de Windows, digamos Windows 7. y en otros entornos, la DLL no debería cargarse. ¿Cómo podré lograr eso usando DLL Delay Loading ya que este tema es completamente nuevo para mí y no hay buenas referencias en línea para este asunto en particular.DLL de carga de retraso

Saludos

+1

¿Está preguntando cómo funciona el retraso de carga, o cómo puede aplicarlo? – xtofl

Respuesta

8

su proyecto puede especificar que un archivo DLL que depende debe ser cargado, pero cuando sea necesario, especificando en el campo del vinculador/Entrada/Delay Cargado DLL. Esta configuración puede ser diferente para diferentes configuraciones de compilación.

+0

Thx para el hombre de la respuesta pero puede darle un ejemplo o un fragmento de código si es aplicable :) –

+4

Ese es el punto de la carga de retraso: es una cosa de configuración, no de código. – xtofl

+0

La redacción parece incorrecta: cuando dice "La DLL de la que depende debe haber estado vinculada con la capacidad de carga de retraso", parece que se está refiriendo a la creación de esa DLL de sus .obj constituyentes. El indicador/DELAY se aplica realmente al módulo que hace el módulo _importing_, no el _imported_. Esa es también la razón por la que puede retrasar la carga de archivos DLL de Windows 2000, que se habrían generado sin este soporte. – MSalters

1

En lugar de usar la demora en la carga, ¿ha considerado utilizar dynamicloading con LoadLibrary y GetProcAddress? Es probable que sea más fácil de usar.

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 

// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. 

PGNSI pGNSI; 
SYSTEM_INFO si; 

ZeroMemory(&si, sizeof(SYSTEM_INFO)); 

pGNSI = (PGNSI) GetProcAddress(
    GetModuleHandle(TEXT("kernel32.dll")), 
    "GetNativeSystemInfo"); 
if(NULL != pGNSI) 
    pGNSI(&si); 
else GetSystemInfo(&si); 
+9

¿Cómo es más fácil escribir código que el enlazador puede generar automáticamente? – xtofl

+2

está bien si solo tiene 1 función a la que desea llamar ... de lo contrario es una mala elección, imo. – Goz

+3

-1 - la compatibilidad con la carga de retraso en el enlazador está específicamente dirigida a evitar que tengas que ocuparte de LoadLibrary() y GetProcAddress(). – Bids

10

MSDN tiene una muy buena descripción here.

Básicamente lo que está haciendo es establecer la DLL en cuestión para estar en la sección de carga de retraso. No cargará esa DLL hasta que realice una llamada a una función que está en esa DLL.

Desde el enlace de arriba:

El enlazador Visual C++ ahora soporta la carga retardada de DLL. Este lo alivia de la necesidad de usar las funciones del SDK de Windows LoadLibrary y GetProcAddress para implementar la carga diferida de DLL.

Antes de Visual C++ 6.0, la única forma de cargar una DLL en tiempo de ejecución era por usando LoadLibrary y GetProcAddress; el sistema operativo cargaría el archivo DLL cuando se cargara el archivo ejecutable o DLL que lo usaba.

A partir de Visual C++ 6.0, el enlazado estático con una DLL, el enlazador proporciona opciones para retrasar cargar el archivo DLL hasta que el programa llama una función en esa DLL.

Una aplicación puede retrasar la carga de una DLL utilizando la opción del vinculador /DELAYLOAD (Delay Load Import) con una función auxiliar (implementación predeterminada proporcionada por Visual C++). La función auxiliar cargará la DLL al ejecutar el tiempo llamando a LoadLibrary y GetProcAddress por usted.

usted debe considerar el retraso de la carga de un archivo DLL si:

Su programa no puede llamar a una función en la DLL.

Es posible que no se invoque una función en el archivo DLL hasta la última parte de la ejecución de de su programa.

La carga diferida de una DLL se puede especificar durante la compilación de ya sea un proyecto .EXE o .DLL. Un proyecto .DLL que demora la carga de de uno o más archivos DLL no debería llamar a un punto de entrada cargado por retraso en Dllmain.

Cuestiones relacionadas