Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


1.4.4b2e  Carga retrasada

§1  Sinopsis

La carga retrasada ("delay load") es una opción de compilación utilizable en la compilación de ejecutables que deban utilizar recursos situados en librerías dinámicas.  Resulta de utilidad con librerías que se usan raramente en un programa pero que son muy voluminosas, y por tanto, tienen un gran coste de carga.

Las DLLs de carga retrasada no son cargadas e inicializadas hasta que el programa alcanza un punto en que se intenta acceder a la librería.  De lo anterior se deduce que se trata de un caso particular de enlazado explícito (dinámico) con el ejecutable que las utiliza.

Ejemplo [2]:

ilink32 /dMyDataBase.dll c0x32 x ,x,,import32 cw32mt MyDataBase.lib


En este caso, la opción /d hace que la librería MyDataBase solo sea cargada cuando realmente se utilice alguno de sus recursos.

Nota:  La RTL del compilador BC++ dispone de utilidades que permiten al usuario cargar a voluntad estas librerías para depurar errores de carga, e incluso suplantar el sistema de retraso si se desea.

§2  Empleo

La opción de carga retrasada puede ser una opción a considerar si:

  • Hay posibilidad de que un recurso no llegue a ser utilizado por el programa.  Por ejemplo, solo se utiliza en determinadas condiciones que pueden no llegar a ocurrir.

  • Un recurso cuya carga es costosa (en término de tiempo e inicialización) solo se requiere hasta un tiempo después de iniciado el programa. De esta forma, al costo de inicio del programa no se le suma el de la DLL. La impresión del usuario es que el programa se inicia más rápidamente.

§3  Restricciones

El compilador BC++ no permite usar el dispositivo de carga retrasada en los siguientes casos:

  • Una librería que contenga referencias a otros datos que deban ser también importados.

  • La librería KERNEL32.DLL (una librería de la API de Windows).

  • La librería RTLDLL, ya que esta librería contiene precisamente las rutinas que soportan la carga retrasada.

§4  Descargar una librería de carga retrasada.

Despues que una DLL ha sido cargada con retraso, puede ser conveniente descargarla manualmente. Para ello, tanto BC++ como MSVC disponen de una función específica de librería, __FUnloadDelayLoadedDLL, que puede descargar la librería y resetear el mecanismo de carga por si fuese necesaria de nuevo en el futuro.

§4.1  Sintaxis

#include <delayimp.h>

BOOL WINAPI __FUnloadDelayLoadedDLL(LPCSTR szDll);


  szDll es un puntero al nombre de la librería a descargar o un valor nulo (NULL) para descargar todas las librerías de carga retrasada.

§4.2  Descripción

Como puede verse, esta función devuelve un bool ( 3.2.1b).  En caso de éxito el valor devuelto es cierto (true) en caso contrario devuelve falso (false).

§4.3  Comentario

Deben observarse precauciones especiales al descargar librerías de carga retrasada en una aplicación multihebra ( 1.7).  Pueden presentarse problemas si una de las tareas obtiene la dirección de una función de librería al mismo tiempo que otra tarea procede a la descarga de la DLL correspondiente.

  Inicio.


[1]  RTL  acrónimo de "RunTime Library" (librerías de ejecución).  Conjunto de librerías que acompañan a los compiladores.

[2]  Suponemos el compilador BC++.  Por su parte MSVC dispone de una opción equivalente.