Avatar billede ruma1974 Nybegynder
20. august 2005 - 10:00 Der er 9 kommentarer og
1 løsning

Hvordan bruger man Initialization i en dll?

Hej,

Er der nogle gode og simple eksempler på hvordan man kan bruge  initialization i en dll til at sætte nogle variable værdier som skal værre konstant under hele dll'ens leve tid?

Jeg vil helst undgå at sende alle konstante variabler hver gang jeg laver en beregning. Eller skal jeg hver gang kalder sende en pointer til en record som så bruges i dll'en?

Jeg har følgende dll:

library dll;

uses
  SysUtils,
  Classes;

{$R *.res}

function Score(seq:pchar):real;export;
var
I:integer;
begin
score:=length(seq);
end;

exports
score;
begin
end.

Som jeg kalder med:

procedure TForm1.Button1Click(Sender: TObject);
begin
DLLHandle := LoadLibrary('dll.dll');
//her vil jeg godt have sat nogle variabler som er konstante
if DLLHandle <> 0 then
begin
@ShowScore :=GetProcAddress(DLLHandle, 'Score');
memo1.Lines.Add(floattostr(Showscore(PChar(edit1.text))));
end;
FreeLibrary(DLLHandle);
end;

mvh,

Rune
Avatar billede nielle Nybegynder
20. august 2005 - 10:38 #1
Skal det være variable - dvs. skal de sidenhen kunne ændre sig? Er det ikke i virkeligheden rigtige konstanter du skal bruge i dit tilfælde?
Avatar billede ruma1974 Nybegynder
20. august 2005 - 10:44 #2
Det skal være variabler. Det skal værre muligt at ændre dem med forskellig kald af dll'en. Når dll'en er loaded skal den kaldes mange gange med de samme variabler men det er også nødvendigt at ændre dem over tid.
Avatar billede nielle Nybegynder
20. august 2005 - 10:47 #3
Har du prøvet den helt oplagte?

uses
    SysUtils,
    Classes;

var
    DinDllVar : integer;

{$R *.res}

function Score(seq:pchar):real;export;
var
    I:integer;
begin
    score:=length(seq);
end;

exports
score;

begin
    DinDllVar := 42;
end.
Avatar billede ruma1974 Nybegynder
20. august 2005 - 11:02 #4
Jo det virker fint, men jeg ville helst kunne sætte DinDllVar fra den unit som kalder programmet.

Jeg kan selvfølgelige gøre det ved at "kalde programmet" gemmer alle settings i en fil som så loades ind mellem begin og end. til sidst i dll'en og derved sætter alle variabbler.

Det der står mellem begin og end. i dll'en bliver det kun kørt når dll'en loades?

bør jeg lave noget oprydning eller er det nok at bruge FreeLibrary(DLLHandle)?
Avatar billede ruma1974 Nybegynder
20. august 2005 - 11:21 #5
Jeg har lige lavt en test for at forsøge at besvare mine egne spørgsmål.

Jeg gemte en setting i en fil som så blev loaded af dll'en for at sætte variablen.

Jeg forsøgt nu at kalde dll'en igen uden at bruge free og uden at loade dll'en igen. Det virkede - denne samme variable blev brugt.

Nu forsøgte jeg så at bruge FreeLibrary(DLLHandle); ændre fil settings også loade dll'en igen og kalde dll functionen igen. Nu var det stadig den gamle setting som blev brugt :-(?

Så jeg skal åbenbart lave mere oprydning end bare FreeLibrary(DLLHandle).
Avatar billede nielle Nybegynder
20. august 2005 - 11:24 #6
For at sætte din variabel fra den kaldende DLL kan du gøre noget i stil med:

uses
    SysUtils,
    Classes;

var
    DinDllVar : integer;

{$R *.res}

function Score(seq:pchar):real;export;
var
    I:integer;
begin
    score:=length(seq);
end;

function SetDinDllVar(NyDinDllVar : integer)
begin
    DinDllVar := NyDinDllVar;
end;

exports
score;

begin
    DinDllVar := 42;
end.
Avatar billede nielle Nybegynder
20. august 2005 - 11:28 #7
Hvis der er et æørende program som holder DLL'en åben så frigives den først endeligt når dette program også lukkes. Alle programmer som bruger DLL'en skal altså være lukket før at du får initialiseret din DLL med de nye settings fra filen.
Avatar billede nielle Nybegynder
20. august 2005 - 11:28 #8
æørende = kørende
Avatar billede ruma1974 Nybegynder
20. august 2005 - 11:31 #9
Selvfølgelig, jeg tænker mig ikke om. Jeg kan jo også bare lave en procedure som loader nye variable settings i dll'en.

Mange tak, du fortjener points. Så hvis du lige laver et svar...
Avatar billede nielle Nybegynder
20. august 2005 - 11:37 #10
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester