MoveX
Messages postés230Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention16 juillet 2005
-
4 déc. 2004 à 10:41
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
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;
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 4 déc. 2004 à 11:38
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.
MoveX
Messages postés230Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention16 juillet 20051 4 déc. 2004 à 14:09
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...
MoveX
Messages postés230Date d'inscriptionvendredi 9 mai 2003StatutMembreDernière intervention16 juillet 20051 4 déc. 2004 à 14:23
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.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 4 déc. 2004 à 19:25
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.