Una DLL (Dynamic Link Library) actúa como una biblioteca compartida de funciones a la que pueden recurrir numerosas aplicaciones y otras DLL. Delphi te deja crear y usar archivos DLL para que pueda llamar a estas funciones a voluntad. Sin embargo, debe importar estas rutinas antes de poder llamarlas.
Las funciones exportadas desde una DLL se pueden importar de dos maneras: declarando un procedimiento o función externa (estática) o mediante llamadas directas a funciones API específicas de la DLL (dinámica).
Consideremos una DLL simple. A continuación se muestra el código para "circle.dll" que exporta una función, llamada "CircleArea", que calcula el área de un círculo utilizando el radio dado:
Una vez que tenga el circle.dll, puede usar la función "CircleArea" exportada desde su aplicación.
Carga estática
La forma más sencilla de importar un procedimiento o función es declararlo utilizando la directiva externa:
Si incluye esta declaración en la parte de interfaz de una unidad, circle.dll se carga una vez cuando se inicia el programa. Durante la ejecución del programa, la función CircleArea está disponible para todas las unidades que usan la unidad donde se encuentra la declaración anterior.
Carga dinámica
Puede acceder a las rutinas en una biblioteca a través de llamadas directas a las API de Win32, que incluyen LoadLibrary, FreeLibraryy GetProcAddress. Estas funciones se declaran en Windows.pas.
A continuación, le indicamos cómo llamar a la función CircleArea mediante carga dinámica:
Al importar utilizando la carga dinámica, la DLL no se carga hasta la llamada a LoadLibrary. La biblioteca es descargada por llame a FreeLibrary.
Con la carga estática, la DLL se carga y sus secciones de inicialización se ejecutan antes de que se ejecuten las secciones de inicialización de la aplicación que realiza la llamada. Esto se invierte con carga dinámica.
¿Debe usar estática o dinámica?
Aquí hay un vistazo simple a las ventajas y desventajas de la carga DLL estática y dinámica:
Carga estática
Pros:
- Más fácil para un desarrollador principiante; ninguna fea" Llamadas a la API.
- Las DLL se cargan solo una vez, cuando se inicia el programa.
Contras:
- La aplicación no se iniciará si faltan archivos DLL o no se pueden encontrar. Aparecerá un mensaje de error como este: "Esta aplicación no pudo iniciarse porque no se encontró 'missing.dll'. Reinstalar la aplicación podría resolver el problema". Por diseño, el orden de búsqueda de DLL con enlace estático incluye el directorio desde el cual la aplicación cargado, el directorio del sistema, el directorio de Windows y los directorios enumerados en el entorno RUTA variable. Tenga en cuenta también que el orden de búsqueda puede ser diferente para varias versiones de Windows. Siempre espere tener todas las DLL en el directorio donde se encuentra la aplicación que realiza la llamada.
- Se usa más memoria ya que todas las DLL se cargan, incluso si no va a utilizar algunas de las funciones.
Carga dinámica
Pros:
- Puede ejecutar su programa incluso cuando algunas de las bibliotecas que usa no están presentes.
- Menor consumo de memoria ya que las DLL se usan solo cuando es necesario.
- Puede especificar la ruta completa a la DLL.
- Podría usarse para aplicaciones modulares. La aplicación solo expone (carga) módulos (DLL) "aprobados" para el usuario.
- La capacidad de cargar y descargar la biblioteca dinámicamente es la base de un sistema de complemento que permite a un desarrollador agregar funcionalidad adicional a los programas.
- Compatibilidad con versiones anteriores de Windows en las que las DLL del sistema pueden no admitir las mismas funciones o no se admiten de la misma manera. Detectar primero la versión de Windows, luego vincular dinámicamente en función de lo que está ejecutando su aplicación, le permite admitir más versiones de Windows y brindan soluciones para sistemas operativos más antiguos (o al menos, deshabilitan con gracia funciones que no puede apoyo.)
Contras:
- Requiere más código, lo que no siempre es fácil para un desarrollador principiante.