1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| function LierFonction(DLL: String; var HandleDLL: THandle; NomFct: String; IndexFct: Integer = -1): Pointer;
begin
//Valeurs de retour par défaut
Result := nil;
HandleDLL := 0;
//Chargement de la DLL. On récupère son handle
HandleDLL := LoadLibrary(pAnsiChar(DLL));
//Si le chargement a échoué, on sort
If HandleDLL = 0 then
Exit;
//On récupère l'adresse de la fonction voulue, que l'on renvoie
If IndexFct < 0 then //Si l'index est négatif on utilise le nom sous forme de chaîne
Result := GetProcAddress(HandleDLL, pAnsiChar(NomFct))
else
//Sinon, on utilise l'index comme identifiant
Result := GetProcAddress(HandleDLL, pAnsiChar(IndexFct));
end;
procedure TForm1.btnSommeClick(Sender: TObject);
var HandleDLL: THandle; //Pour stocker le handle de la DLL chargée
Somme : function(A, B: integer): integer; stdcall; //Notre fonction, sous forme de variable
begin
//On récupère le pointeur sur notre fonction nommée 'Somme' au sein de DLL1.dll
Somme := LierFonction('DLL1.dll', HandleDLL, 'Somme');
//Si Somme a bien reçu un pointeur valide sur une fonction
If assigned(Somme) then
try
//L'appel de la fonction se passe comme avec une fonction ordinaire
ShowMessageFmt('%d + %d = %d', [A.Value, B.Value, Somme(.Value, B.Value)]);
finally
//Ne pas oublier de libérer la DLL lorsqu'elle n'est plus nécessaire
FreeLibrary(HandleDLL);
end
else
//Sinon, on affiche un message d'erreur : appeler Somme provoquerait une violation d'accès
ShowMessage('Erreur de chargement de la fonction "Somme"');
end; |
Partager