Actualización a Delphi 2010: Bibliotecas dinámicas: delayed (I)

Usualmente las bibliotecas dinámicas (DLLs) se cargan a memoria de dos formas desde nuestro programa: Implícitas y explicitas.

Las implícitas se declaran de manera muy simple, pero deben estar presentes al momento de iniciar el programa. Si no lo están, la carga del ejecutable falla completamente.

Las explicitas no tienen esa limitante y el programa puede cargarse, buscar la dll cuando haga falta y reaccionar adecuadamente a su ausencia. El precio que se paga es que hay que escribir un poco mas de código para conseguirlo.

A partir de Delphi 2010, existe una tercera forma de declarar las funciones de una DLL: delayed, que nos ofrece mayor simplicidad en la declaración y la capacidad de reaccionar ante la ausencia de la DLL. En este primer artículo de la serie veremos como declarar y utilizar las funciones de una DLL de esta manera.

La idea principal de la nueva palabra delayed es el hecho que la DLL no se cargará al arrancar el programa (como en el caso de la declaración implícita), sino la primera vez que se necesite. La sintaxis es muy similar a la declaración de funciones para carga implícita, con la excepción que se añadirá la palabra delayed antes del punto y coma (luego del nombre de la DLL).

Tomando un ejemplo de Dr. Bob, les dejo primero el código fuente de la DLL que se utilizará en el ejemplo:

library eBob42;

  function Add(X,Y: Integer): Integer; overload; stdcall;
  begin
    Result := X + Y
  end;

  function Add(X,Y: Double): Double; overload; stdcall;
  begin
    Result := X + Y
  end;

  exports
    Add(X,Y: Integer) name 'Add',
    Add (X,Y: Double) name 'AddFloat';

  end.

Ahora, la declaración de las funciones para realizar la carga retardada sería la siguiente:

unit eBob42Delayed;
  interface

  const
    DLL = 'eBob42.DLL';

    function Add(X,Y: Integer): Integer; overload; stdcall
      external DLL delayed;

    function Add(X,Y: Double): Double; overload; stdcall
      external DLL name 'AddFloat' delayed;

  implementation

  end.

Al compilar esta unidad, el compilador nos alerta (warnings) que esta característica es específica de la plataforma Win32.

En una siguiente entrega veremos como reaccionar al hecho de que la DLL no se encuentre en tiempo de corrida.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s