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.
[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.