26. februar 2002 - 14:53Der 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.
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.
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
Ellers kan du vel lave nogle standardprocedurer som sørger for at gøre den dynamiske binding så smertefri som muligt ?!
Synes godt om
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;
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.