¿Que son las dll? Las Dlls o Librerías de enlace dinámico contienen código ejecutable que es usado por los programas
Una de las principales ventajas es que son cargadas una sola vez en memoria y compartidas por varias App Ej. (kernel32.dll, ntdll.dll) que son usadas por varios Programas.
Una biblioteca ahorra espacio en disco y en memoria ya que se carga una sola véz, si una biblioteca dinámica es recompilada las Apps que la usan no tienen que ser recompiladas. Si una Dll no es usada por ningún proceso esta es descargada automáticamente de la memoria. Si se tiene algún código de una tarea que vaya a ser ejecutada por varias Apps que realicemos es mejor almacenarlo en alguna DLL.
Para crear una DLL vamos a:

Y allí marcamos la opción.

Hecho esto insertaremos el siguiente código
library blackhat;
function suma(a,b:Integer):Integer;stdcall;
begin
Result:=a+b;
end;
function resta(a,b:Integer):Integer;stdcall;
begin
Result:=a-b;
end;
{$R *.res}
exports {funciones que se van a exportar}
suma,resta;
begin
end.
Luego vamos a Project -> Compile blackhat y ya está creada la DLL.
¿Cómo Usarla?
Ahora llamaremos las funciones desde un Prog. Creamos una nueva App y en el form insertamos un componente TEdit y 2 TButton. Copiamos la dll creada al directorio del programa que estamos haciendo ya que al hacer la llamada primero buscara en el dir de la App y luego en las carpetas definidas por el Sistema
(System …). En el codigo del programa insertamos el Siguiente Código:
Debajo de implementation
//Hace referencia a la función sumafunction suma(a,b:Integer):Integer;stdcall external ' blackhat.dll';
En el evento click del Button1:procedure TForm1.Button1Click(Sender: TObject);
begin
//Llamamos a la funciónEdit1.Text:=IntToStr(suma(5,6));
end;
En el Evento Click del Button2:
procedure TForm1.Button2Click(Sender: TObject);
var
lib:HINST;
resta:function (a,b:Integer):Integer;stdcall;
pfunc:Pointer;
begin
lib:=LoadLibrary(' blackhat.dll');
if lib<>0 then
begin
pfunc:=GetProcAddress(lib,pchar('resta'));
@resta:=pfunc;
Edit1.Text:=IntToStr(resta(10,6));
FreeLibrary(lib);
end
else
ShowMessage('La dll no ha podido cargarse');
end;
¿Qué es stdcall?
Stdcall es el modo en que se pasan los parámetros a la pila en las funciones de la API de Windows así que para que nuestra App pueda ser usada desde diferentes lenguajes de programación debemos pasar los parámetros de esta manera. Existen otros convenios de llamada como pascal,register,safecall(el usado por el delphi),cdel en Stdcall los parámetros se pasan de derecha a izquierda empezando por el ultimo.
La llamada a la siguiente función:MessageBox (Handle,'Titulo de la Ventana','Mensaje',MB_OK);
Es interpretada como:PUSH Handle
PUSH Titulo de la Ventana
PUSH Mensaje
PUSH MB_OK
CALL MessageBox // Llama a la función MessageBox.
El método en que es llamada la función suma carga la dll al iniciar el programa y la mantiene en memoria Durante toda la ejecución y solo es liberada la memoria ocupada cuando este finaliza. Sin embargo el modo en que llamamos la función resta solo carga la Dll en memoria cuando es necesaria y luego la libera. Este método es un poco complejo pero se tiene muchomMás control de la App y nos ahorra recursos.
var
lib:HINST;
Es Equivalente al tipo de dato CardinalHINST (Handle a una instancia)
resta:function (a,b:Integer):Integer;stdcall;
Declaramos la variable de tipo función
pfunc: Pointer;Puntero sin tipo puede apuntar a cualquier tipo de dato. Lo usamos para apuntar a la dirección de la función resta
BeginLa función LoadLibrary forma parte del API de Windows y se encuentra en la librería kernel32.dll es la encargada de cargar en memoria las Dlls existen otras func con mas parámetros y avanzadas como LoadLibraryEx.
lib:=LoadLibrary(' blackhat.dll');
if lib<>0 then
Si la carga de la dll es satisfactoria ejecutamos lo sigte.
beginCon GetProcAddress obtenemos la dirección en memoria
pfunc:=GetProcAddress(lib,pchar('resta'));
De la función resta.@resta:=pfunc;Ahora la variable resta apunta a la posición de memoria
De la función del mismo nombre.
Edit1.Text:=IntToStr(resta(10,6));Hacemos la llamada a la funcion
FreeLibrary(lib);Liberamos la librería después de usarla.
Escrito por Reinier Nápoles Martínez [rnapoles@ipihlg.rimed.cu]
