Vida

Carga de la biblioteca de enlaces dinámicos estáticos vs dinámicos

Carga de la biblioteca de enlaces dinámicos estáticos vs dinámicos

Una DLL (Dynamic Link Library) actúa como una biblioteca compartida de funciones a la que pueden recurrir numerosas aplicaciones y otras DLL. Delphi le permite 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 pueden importarse 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.

Aquí le mostramos cómo llamar a la función CircleArea usando carga dinámica:

Al importar utilizando la carga dinámica, la DLL no se carga hasta la llamada a LoadLibrary. La biblioteca se descarga mediante la llamada 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; no hay llamadas API "feas".
  • 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 se pudo iniciar porque no se encontró 'missing.dll'. Reinstalar la aplicación puede solucionar este problema". Por diseño, el orden de búsqueda de DLL con enlace estático incluye el directorio desde el que se cargó la aplicación, el directorio del sistema, el directorio de Windows y los directorios enumerados en la variable de entorno PATH. 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 usar 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 proporcionar soluciones para sistemas operativos más antiguos (o al menos, deshabilitar con gracia características que no puede admitir).

Contras:

  • Requiere más código, lo que no siempre es fácil para un desarrollador principiante.