Chargement dynamique de dll [Résolu]

MoveX 230 Messages postés vendredi 9 mai 2003Date d'inscription 16 juillet 2005 Dernière intervention - 4 déc. 2004 à 10:41 - Dernière réponse : cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention
- 4 déc. 2004 à 22:29
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?
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 4 déc. 2004 à 11:38
3
Merci
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.

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
MoveX 230 Messages postés vendredi 9 mai 2003Date d'inscription 16 juillet 2005 Dernière intervention - 4 déc. 2004 à 14:09
0
Merci
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...
Commenter la réponse de MoveX
MoveX 230 Messages postés vendredi 9 mai 2003Date d'inscription 16 juillet 2005 Dernière intervention - 4 déc. 2004 à 14:23
0
Merci
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
Commenter la réponse de MoveX
MoveX 230 Messages postés vendredi 9 mai 2003Date d'inscription 16 juillet 2005 Dernière intervention - 4 déc. 2004 à 18:58
0
Merci
je vois pas d ou vient le probleme... si tu as une idee...
Commenter la réponse de MoveX
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 4 déc. 2004 à 19:25
0
Merci
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.
Commenter la réponse de cs_Delphiprog
MoveX 230 Messages postés vendredi 9 mai 2003Date d'inscription 16 juillet 2005 Dernière intervention - 4 déc. 2004 à 19:48
0
Merci
oui, bon, je vais reprendre le code que tu mas donne.
merci encore, et desole de te deranger.
Commenter la réponse de MoveX
MoveX 230 Messages postés vendredi 9 mai 2003Date d'inscription 16 juillet 2005 Dernière intervention - 4 déc. 2004 à 21:15
0
Merci
WOOHOO !!
ca marche !! merci encore Delphiprog
Commenter la réponse de MoveX
MoveX 230 Messages postés vendredi 9 mai 2003Date d'inscription 16 juillet 2005 Dernière intervention - 4 déc. 2004 à 21:42
0
Merci
euh, alors, quelqu un pourrait mexpliquer comment on peut appeler une procedure presente sur une form, depuis une dll?
Commenter la réponse de MoveX
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 4 déc. 2004 à 22:29
0
Merci
Nouvelle question --> nouvelle entrée sur le forum et nouveau titre, please :approve)
Commenter la réponse de cs_Delphiprog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.