DLL filer i Delphi

Tags:    delphi
Skrevet af Bruger #105 @ 23.09.2002
DLL filer i Delphi

DLL filer er en måde hvorpå man kan dele kode mellem flere forskellige programmer. Hvis man f.eks. udgiver nogle programmer, som deler en masse funktionalitet, vil det være smart at placere denne funktionalitet i en DLL fil så man kun behøver at installere den én gang på brugerens computer. Herved sparer man både en smule plads på brugerens harddisk, men det gør det også nemmere at rette fejl, da man kun behøver at opdatere sin DLL fil i stedet for samtlige programmer.

Det kræver dog en lille smule mere arbejde at benytte sig af DLL filer og de kan virke ’skræmmende’ for folk der ikke har prøvet at arbejde med dem. I denne artikel vil jeg give en kort introduktion til hvordan man laver en DLL fil og hvordan man bruger den fra sit normale Delphi program.


Oprettelse af DLL filen



For at oprette en DLL fil i Delphi vælger man File -> New -> Other. Vælg DLL Wizard og tryk OK. Delphi generer følgende ’skelet’:

library Project1;

{ 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.
Man laver sine functions og procedurer på næsten samme måde som i et normalt program:

library DLLtest;
uses
  SysUtils, Dialogs,
  Classes;

{$R *.res}

procedure Test(); stdcall;
begin
  ShowMessage('Hej fra en DLL');
end;

exports
  Test;

end.
Før man kan kalde sine funktioner fra andre programmer, skal man for det første angive hvilken calling convention der skal bruges, dvs. hvordan funktionen skal eksporteres. Dette gøres på følgende måde:

procedure DinProcedure(parametre); CallingConvention; 
I ovenstående eksempel bliver det til:

procedure Test(); stdcall;
StdCall vil typisk være den calling convention man benytter. Der findes andre måder at gøre det på, men dem vil jeg ikke komme ind på her. Vil man vide mere om den står de beskrevet under ”Calling conventions” i Object Pascal Language Guide hjælpefilen.

Den næste ting man skal gøre er at tilføje funktionen til listen over eksporterede funktioner. I ovenstående eksempel kom det til at så sådan her ud:

exports
  Test;
Compile nu projektet ved at trykke Ctrl+F9 og gem det som DLLtest.

Oprettelse af testprogrammet

Luk DLL projektet og opret et nyt program ved at sige File -> New -> Application. Start med at gemme dette projekt i den samme mappe som du gemte DLL projektet i.

For at importere en funktion fra en DLL skal man angive navnet på den funktion man vil importere samt hvilken DLL fil den befinder sig i. Dette gøres på følgende måde:

procedure Navn(); external ’NavnetPåDLLFilen.dll’ Name ’NavnetPåFunktionenManVilKalde’;
Bemærk at den funktion man definerer i Delphi ikke behøver at hedde det samme som det funktionen hedder i selve DLL filen. Hvis man ønsker at omdøbe funktionen skal man angive hvad funktionen hedder i DLL filen efter Name. Hvis man ikke vil omdøbe funktionen kan Name-delen udelades.

For at importere funktionen fra den DLL fil der blev lavet tidligere skriver man:

procedure DLLTest(); External 'DLLtest.dll' Name 'Test';
Funktionen er her importeret som DLLTest() selvom den hedder Test i DLL filen. Man kunne også have valgt at skrive:

procedure Test(); External 'DLLtest.dll' Name 'Test';
eller

procedure Test(); External 'DLLtest.dll';
Resultatet bliver det samme.

Placer nu en knap på formen og opret en OnClick event og prøv at kalde Test().

Den fulde source kode til programmet kommer til at se sådan her ud:

unit Hovedprogram;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

procedure Test(); External 'DLLtest.dll';

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Test;
end;

end.
Hvis man har fået mod på at lære mere om DLL filer kan man læse følgende tre artikler:

Forms i DLLer af Thomas Due
Forms i DLL af Jens Borrisholt
Dynamisk læsning af DLL af Jens Borrisholt



Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (8)

User
Bruger #714 @ 24.03.03 22:00
Husk at læse noten der står øverst! Husk at tilføje ShareMem til dll'ens uses som det første, og til projektens unit, også som det første.
User
Bruger #3530 @ 21.09.03 17:09
Er det muligt at lave specielle DLL-Fils kommandoer ? altså f.eks. en funktion der slukker windows når man loader DLL-filen. Hvis ikke er meningen så ikke bare at "opbevare" kode i DLL filer ?
(mener at have læst i Alt om DATA at man kan tilføje f.eks. en slukkefunktion i en DLL fil og så lave en genvej til det, det ville jo være smart hvis man kunne gøre det i delphi)
User
Bruger #1680 @ 22.10.03 21:01
en meget lærerig artikel, i et godt og forståeligt dansk. Tak skal du have
User
Bruger #3275 @ 28.06.04 16:15
God artikel! Faktisk lige hvad jeg stod og manglede. Og lige en kommentar til Kaare. Hvis jeg skriver ShareMem i mit programs uses liste kan det ikke compiles.
User
Bruger #2330 @ 10.09.04 00:03
Kaare, Der står faktisk: " To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters.", og da ShareMem er interface til BORLNDMM.DLL, så skal den altså kune bruges, hvis du sender strings til calleren(Eller omvendt), og det gøres ikke i dette eks.!
User
Bruger #10266 @ 29.11.06 15:18
Jeg får fejl i ShowMessage('Hej fra en DLL'); den siger
[Error] Project2.dpr(21): Undeclared identifier: 'ShowMessage'

?
User
Bruger #10266 @ 29.11.06 15:19
Så.. Manglede en ting under Uses :S
User
Bruger #10266 @ 29.11.06 15:21
Hvordan gemmer man som DLL? :S
Du skal være logget ind for at skrive en kommentar.
t