Cómo crear y utilizar una librería (dll) en Delphi. Os explicamos (con ejemplo incluido) cómo crear un procedimiento en una DLL y cómo llamar a este procedimiento desde una aplicación externa en Delphi y Visual Basic.
- Librería DLL.
- Crear una librería DLL en Delphi 6.
- Utilización de la librería DLL creada en Delphi.
- Utilización de la librería DLL creada en Visual Basic.
Librería DLL
Una DLL ó Dynamic Linking Library (Bibliotecas de Enlace Dinámico), es un archivo con código ejecutable que se carga, bajo demanda del programa que lo llama, por parte del sistema operativo. Contienen funcionalidad o recursos que utilizan otras aplicaciones. Algunas de las ventajas de su uso:
- Reducen el tamaño de los archivos ejecutables de la aplicación.
- Pueden estar compartidas entre varias aplicaciones, cuando el código es suficientemente genérico puede resultar de utilidad para varias aplicaciones.
- Facilitan la gestión y aprovechamiento de la memoria del sistema.
- Incrementan la flexibilidad frente a cambios.
Crear una librería DLL en Delphi 6
En primer lugar abriremos Delphi, desde el menú «File» – «New» – «Other…»:
seleccionaremos «DLL Wizard» y pulsaremos «OK»:
El código que nos aparecerá por defecto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
library libreriaPrueba; { Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. } uses SysUtils, Classes; {$R *.res} begin end. |
Podremos añadir formularios, como si de una aplicación normal se tratara (salvando algunas excepciones) y procedimientos. Para hacer que los procedimientos puedan ser utilizados por aplicaciones externas, deberemos añadir la cláusula «export» en una línea de código con «export nombreProcedimiento» . Por ejemplo, añadiremos un procedimiento que al ser llamado por otra aplicación muestre un mensaje con el texto que se le pase como parámetro. Para ello añadiremos el siguiente código después de «{$R *.res}»:
1 2 3 4 5 6 7 8 |
procedure pruebaMensaje (mensaje : string); begin ShowMessage (mensaje) ; end; exports pruebaMensaje; |
tendremos que añadir al «uses» la unidad «Dialogs» que es donde se encuentra la función «ShowMessage», el código completo quedará así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
library ejemploLibreria; uses SysUtils, Classes, Dialogs; {$R *.res} procedure pruebaMensaje (mensaje : string); stdcall; begin ShowMessage (mensaje) ; end; exports pruebaMensaje; begin end. |
guardaremos el proyecto, desde «File» – «Save all»:
compilaremos el proyecto, para comprobar errores y generar el fichero .dll, desde el menú «Project» – «Build nombreProyecto «:
Si no ha habido problemas nos habrá creado un fichero .dll el el directorio del proyecto, con el mismo nombre que el del proyecto, en nuestro caso «ejemploLibreria.dll»:
Utilización de la librería DLL creada en Delphi
Una vez generada la dll, realizaremos una aplicación de ejemplo que haga una llamada a la misma y al procedimiento creado anteriormente «pruebaMensaje». Para ello abriremos Delphi, menú «File» – «New» – «Application». En el código de la unidad del formulario desde el que queramos utilizar la dll, añadiremos lo siguiente:
1 |
procedure pruebaMensaje (mensaje : string); stdcall external 'ejemploLibreria.dll'; |
El código completo del formulario será:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
unit UnidadMenuPrincipal; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; txtMensaje: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; procedure pruebaMensaje (mensaje : string); stdcall external 'ejemploLibreria.dll'; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin pruebaMensaje (txtMensaje.Text); end; end. |
Por supuesto, si la librería no está en la misma carpeta que el ejecutable que la llama o si no está en la carpeta del sistema (System32), dará el siguiente error:
con el texto:
accesoDLL.exe – No se puede encontrar el componente
Error al iniciar la aplicación porque no se encontró ejemploLibreria.dll. La reinstalación de la aplicación puede solucionar el problema.
Aceptar
Para solucionarlo y para que cualquier aplicación externa pueda utilizar nuestra DLL la copiaremos a la carpeta del sistema, normalmente ubicada en:
C:/Windows/System32
Si ejecutamos la aplicación que accede a la DLL obtendremos este resultado:
Utilización de la librería DLL creada en Visual Basic
En este caso hemos utilizado Delphi para realizar la aplicación que utiliza la DLL creada anteriormente, pero podríamos utilizar las funciones de la DLL con cualquier lenguaje de programación. Por ejemplo, para utilizarla con Visual Basic, añadiríamos la siguiente línea de código:
1 2 3 4 |
Option Explicit Private Declare Sub pruebaMensaje Lib "ejemploLibreria.dll" (ByVal mensaje As String) |
y en el procedimiento que haga la llamada:
1 2 3 |
Private Sub Command1_Click() Call pruebaMensaje(txtMensaje.Text) End Sub |
La aplicación quedará de la siguiente forma:
y si la ejecutamos:
Nota: se ha utilizado la directiva estándar de tipo de llamada «stdcall», porque es la que normalmente se utiliza, es compatible con cualquier lenguaje.
Si eres usuario registrado (puedes hacerlo desde aquí gratuitamente) puedes descargar el código fuente (completo y totalmente gratuito/free) pulsando aquí.