Saiyine
Punto Com

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.

Rollos antiguos

2004-07-14 00:00:00 - Como dibujar en los pixels de un bitmap con punteros (mas rapido que pixel(]) y como pasar de TColor a RGB.

2001-01-01 00:00:00 - Como crear un bitmap en tiempo de ejecucion y como dibujar puntos mas rapidamente que con pixel[].

2001-01-01 00:00:00 - Como averiguar el codigo ascii de una tecla pulsada en el form y como simular la pulsacion de otra.

2001-01-01 00:00:00 - Borrar un elemento de un listbox/combobox sabiendo el texto, usar indexof.

2001-01-01 00:00:00 - Asociar una extension a un programa.

Saiyine

Selfie of meHi! Welcome to Saiyine Punto Com where I talk about anything that goes through my mind!

Puedo prometer y prometo que a la mayor brevedad aquí irá un menú o algo asín.