Como hacer una libreria DLL
2001-01-01 00:00:00
library EjemploDLL; uses SysUtils, Classes, dialogs; procedure Hola; stdcall; export; begin ShowMessage('Holaaaaaaaa'); end; exports Hola; end.
Este es un ejemplo de DLL muy simple, que solo contiene el procedimiento Hola. Como podeis ver hay al menos tres diferencias con un programa normal:
1/ library EjemploDLL; ---> Para indicar al compilador que es una libreria
2/ procedure Hola; stdcall; export; ---> Con esas dos palabras indicamos que ese procedimiento se puede usar por otro programa.
3/ exports Hola; ---> Dejamos claro que es lo que queremos exportar.
Luego, para usarla solo tenemos que hacer: (haz un programa con dos botones para el ejemplo)
procedure Hola; external 'EjemploDLL.dll'; procedure TForm1.Button1Click(Sender: TObject); begin Hola; end; procedure TForm1.Button2Click(Sender: TObject); var hMod : THandle; HelloWorld : procedure; begin hMod := LoadLibrary('EjemploDLL.dll'); if (hMod = 0) then Exit; @Hola := GetProcAddress(hMod, 'Hola'); if @Hola nil then Hola; FreeLibrary(hMod); end;
El segundo metodo es bastante mas complicadillo, pero permite mucho mas control en plan dar un error si el DLL no se encuentra y cosas asi.
Por cierto, los DLL se pueden ejecutar (lease, 'el windows los encuentra') cuando estan en:
1/ El mismo directorio que el ejecutable
2/ En el directorio de windows (C:\windows normalmente)
3/ En el directorio de sistema de windows (C:\windows\system normalmente)
4/ En los directorios señalados por la variable de sistema PATH
Deberia haber una tercera forma para llamar a las funciones de un dll, en realidad es una variante de la segunda, que es guardar el dll dentro de los resources del ejecutable y luego leerlo en tiempo de ejecucion, pero no consigo hacerlo sin pasar por el disco (en el momento en que el dll se escribiese en el disco estariamos haciendo la version dos de la llamada)... esto que puede parecer un rollo tiene su utilidad, con esto podrias hacer programas que practicamente no dieran problemas de pantallazos azules.