Chargement dynamique de dll [Résolu]

Signaler
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
-
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
-
voici mon code:

procedure TFormPrincipale.FormCreate(Sender: TObject);
var
  Sr: TSearchRec;
  Index: TProcedure;
  Handle: THandle;
begin
  if FindFirst(ExtractFilePath(Application.ExeName)+'dll\'+'*.dll',faAnyFile, Sr)=0 then      //trouve toutes les dll
  repeat
    ListBox1.Items.Add(Sr.Name);
    Handle:= LoadLibrary(PChar(Sr.Name));
    if Handle <> 0 then
        try
        // Charge dynamiquement une fonction de la dll
        @Index:= GetProcAddress(Handle, 'index');
        if @Index <> nil then
          begin

            Index;
          end;
        finally
          FreeLibrary(Handle); //Assure le déchargement de la dll
        end; // Try..Finally
   until FindNext(Sr)<> 0;
  FindClose(Sr);
end;


en gros, ca trouve toutes les dll, puis essaie de les charger une a une en fonction de la presence dun procedure. les dll trouvees sont affichees dans un listbox. ce code marche nikel.
je voudrais que les dll affichees dans le listbox ne soient que les dll chargees, et pas celles trouvees.
j ai fait cela :

procedure TFormPrincipale.FormCreate(Sender: TObject);
var
  Sr: TSearchRec;
  Index: TProcedure;
  Handle: THandle;
begin
  if FindFirst(ExtractFilePath(Application.ExeName)+'dll\'+'*.dll',faAnyFile, Sr)=0 then      //trouve toutes les dll
  repeat
    Handle:= LoadLibrary(PChar(Sr.Name));
    if Handle <> 0 then
        try
        // Charge dynamiquement une fonction de la dll
        @Index:= GetProcAddress(Handle, 'index');
        if @Index <> nil then
          begin
            ListBox1.Items.Add(Sr.Name);
            Index;
          end;
        finally
          FreeLibrary(Handle); //Assure le déchargement de la dll
        end; // Try..Finally
   until FindNext(Sr)<> 0;
  FindClose(Sr);
end;


et la, pouff, il naffiche plus rien du tout.

que faire?

9 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Si cela marchait dans le premier cas c'est sans doute parce que tes DLL étaient dans le même dossier que l'application à ce moment là.
LoadLibrary ne trouvera un bibliothèque QUE si tu lui fournis le chemin exact.
Le code ci-dessous montre où est ton point faible.

var
  Sr: TSearchRec;
  Main: TProcedure;
  LibHandle: THandle;
  AppPath: string;
begin
  //Chemin de base de la recherche
   AppPath := ExtractFilePath(Application.ExeName) + 'dll\';
  if FindFirst( AppPath+ '*.dll', faAnyFile, Sr) = 0 then //trouve toutes les dll
    repeat
      //IL FAUT indiquer le chemin complet !
      LibHandle := LoadLibrary(PChar(AppPath + Sr.Name));
      if LibHandle <> 0 then
      try
        // Charge dynamiquement une fonction de la dll
        @Main := GetProcAddress(LibHandle, 'Main');
        if Assigned(Main) then
        begin
          ListBox1.Items.Add(Sr.Name);
          Main;
        end;
      finally
        FreeLibrary(LibHandle); //Assure le déchargement de la dll
      end; // Try..Finally
    until FindNext(Sr) <> 0;
  FindClose(Sr);
end;


Je me suis permis de renommer la procédure Index en Main car Index est un mot réservé et a un sens particulier dans une Dll. Je me suis dit que ce n'était pas la peine de se créer des problèmes supplémentaires !

En déboguant en pas à pas, tu aurais dû t'apercevoir que LoadLibrary renvoyait toujours 0 signifiant ainsi que la Dll était introuvable.

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
merci beaucoup !

en fait, la procedure index est une procedure que je vais integrer a toutes mes dll, afin de faire un systeme de plugins... mais si tu dis que main cest mieux...
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
euh, apres verif, ca marche toujours pas. si je met le
 ListBox1.Items.Add(Sr.Name);

juste apres le repeat, alors cest bon, mais pas dans lexemple que tu m as donne. j ai toujuors le meme probleme. je vais chercher dans qq heures, la j ai pas le temps.

merci encore
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
je vois pas d ou vient le probleme... si tu as une idee...
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Le code que j'ai donné a subi quelques modifications pour fonctionner comme tu le souhaites. Compare le au code que tu as donné juste avant, ligne après ligne.
Ce que tu en as fait après, je ne suis pas responsable !

Je n'ai absolument pas dit que "Main" était mieux. J'ai simplement précisé qu'utiliser "index" était un mot réservé dans le contexte d'une DLL. L'utilisation de mots réservés à des fins d'identificateur est à bannir, quelque soit le langage utilisé.

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
oui, bon, je vais reprendre le code que tu mas donne.
merci encore, et desole de te deranger.
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
WOOHOO !!
ca marche !! merci encore Delphiprog
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
euh, alors, quelqu un pourrait mexpliquer comment on peut appeler une procedure presente sur une form, depuis une dll?
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Nouvelle question --> nouvelle entrée sur le forum et nouveau titre, please :approve)