Avatar billede justincase1089 Nybegynder
26. februar 2002 - 14:53 Der er 3 kommentarer og
2 løsninger

Kalde en procedure i en DLL

Hej

Jeg har to DLLer (DLL1 og DLL2), med en identisk procedure eksporteret. Lad os kalde den Test (fantastisk navn).

Fra et program vil jeg afhængig af en boolean kalde procedure Test i enten DLL1 eller DLL2 Statisk!:

procedure Test; external 'DLL1.DLL';

problemet er, at jeg ikke må benytte en variabel i setdet for 'DLL1.DLL'.

Hvordan løser jeg det ?

Jeg vil meget gerne, hvis jeg kan undgå at gøre det dynamisk. Jeg har et shitload af procedurer og funktioner som alt andet lige bliver ret belastende at konvertere.

MVH Justin Case


Avatar billede stoney Nybegynder
26. februar 2002 - 15:06 #1
Hvis det en boolean værdi kan du vil gøre med en simpel if.. then.. else

Stoney
Avatar billede justincase1089 Nybegynder
26. februar 2002 - 15:51 #2
??????

Mere forklaring:

Hvis et eller andet er opfyldt så kaldes Test i DLL1
Hvis noget andet er opfyldt kaldes Test i DLL2

Jeg vil kun have Test erklæret en gang i programmet så det er det der står i 'DLL1.DLL' der skal skiftes ud afhængig af, om det ene eller det andet er opfyldt.
Avatar billede cms Nybegynder
27. februar 2002 - 00:07 #3
Statisk binding går netop ud på at det laves om til maskinkode ved kompilering. Du har ingen mulighed for at ændre i tekststrengen 'DLL1.DLL' i koden efter kompilering.
Hvis den booleanske variabel kan sættes før kompilering kan du bruge compiler defines, som fx

{$DEFINE LoadNo1}
procedure Test; external {$IFDEF LoadNo1}'DLL1.DLL'{$ELSE}'DLL2.DLL'{$ENDIF}

Ellers kan du vel lave nogle standardprocedurer som sørger for at gøre den dynamiske binding så smertefri som muligt ?!
Avatar billede Slettet bruger
27. februar 2002 - 20:14 #4
Load Den dynamisk.

unit DLLUnit;
interface

uses Windows, Forms, Dialogs;
Type
TProc:Procedure; //Proceduren uden navn

Var
Proc:TProc;
Handle:Cardinal;

Procedure LoadDLL(Filename:String);
Begin
    Handle:=LoadLibrary(PChar(Filename));
    if Handle <> 0 then
    begin
    Proc:=TProc(GetProcAddress(Handle, 'Test'));
    if  Not Assigned(Proc) then
    Begin
    Showmessage('Kan ikke Finde procduren');
    Application.Terminate;
    FreeDLL,
    End;
    End
    Else
    Begin
    Showmessage('Kan ikke finde filen');
    FreeDLL;
    End;
End;

Procedure FreDLL;
Begin
    FreeLibrary(Handle);
End;

End.

Mvh. Simon
Avatar billede justincase1089 Nybegynder
28. februar 2002 - 17:36 #5
Som jeg formodede.
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