| |
Posté le 07 novembre 2005 - 21:02 |
Bonjour Je tente desesperement d'utiliser une DLL pour gérer des photos. La librairie est plus complète que celle de Windev (enfin pour ce dont j'ai besoin)
Mais j'ai du mal à comprendre comment on fait appel à cette DLL.
Il s'agit d'une librairie open source : FreeImage.dll La doc se trouve ici : http://cogent.dl.sourceforge.net/sourceforge/freeimage/FreeImage380.pdf
Si j'essaie de faire : AppelDLL32("FreeImage.dll", "FreeImage_GetVersion") windev me dit : La fonction 'FreeImage_GetVersion' n'a pas été trouvée dans la DLL
Que faire selon vous ? je me trompe dans l'appel ?
merci |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 09:32 |
1° Essaye avec "scanbin" de voir la liste des fonctions contenues dans ta dll 2° Rajoute un A au nom de la fonction FreeImage_GetVersion AppelDLL32("FreeImage.dll", "FreeImage_GetVersionA") 3° Attention il faut que ta DLL soit chargée avant avec hDLL est un entier (global) = ChargeDll("FreeImage.dll") if hDLL=0 then erreur("Impossible de charger la dll !"); retour et quant tu en as plus besoin if hDLL>0 then dechargedll(hDLL) |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 09:57 |
PROBLEME RESOLU AVEC "SCANBIN" utilitaire génial qui analyse les DLL et donne la liste des fonctions exportées... et sur FreeImage.dll on a la surprise de voir que tous les noms ont un préfixe et un suffixe DLLname est une chaîne = "E:\FreeImage\WIN32\FreeImage\Dist\FreeImage.dll" Temp est un Variant hDLL est un entier = ChargeDLL(DLLname)
IF hDLL>0 THEN Temp = AppelDLL32(DLLname, "_FreeImage_GetVersion@0") Info(Temp) DéchargeDLL(hDLL) ELSE Erreur("Chargement de la DLL impossible...") END
Affiche "269451812" si tu veux le fichier texte des fonctions donne adresse mail |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 10:06 |
J'ai remarqué que les fonctions retournent des pointeurs donc il faut faire DLLname est une chaîne = "E:\FreeImage\WIN32\FreeImage\Dist\FreeImage.dll" AdresseMessage est un entier CopyrightMessage est une chaîne ASCIIZ sur 1024 ="" hDLL est un entier = ChargeDLL(DLLname)
IF hDLL>0 THEN AdresseMessage = AppelDLL32(DLLname, "_FreeImage_GetCopyrightMessage@0") Transfert(&CopyrightMessage,AdresseMessage,1023) Info(CopyrightMessage) DéchargeDLL(hDLL) ELSE Erreur("Chargement de la DLL impossible...") END |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 10:19 |
Salut,
Si j'essaie de faire : AppelDLL32("FreeImage.dll", "FreeImage_GetVersion") windev me dit : La fonction 'FreeImage_GetVersion' n'a pas été trouvée dans la DLL
Que faire selon vous ? je me trompe dans l'appel ?
Essayes avec un "A" en fin de fonction:
AppelDLL32("FreeImage.dll", "FreeImage_GetVersionA") |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 10:23 |
Alors là je suis scié J'ai utilisé scanbin après avoir lu plusieurs topic sur le forum à propos des dll, et je n'etais pas plus avancé.tes
Dans la liste des "fonctions importées" trouvées par scanbin je vois juste : GetVersionExA. Comment tu en deduis qu'il y a un prefixe et un sufixe ???? et comment tu definis ce que sont ces 2 infos ? "_FreeImage_GetVersion@0" je suppose qu'il s'agit du _ devant, et du 0 à la fin. mais pourquoi le @ ?
Je débute dans l'utilisation des DLL, et là j'avoue que ça me laisse perplexe...
En tout cas merci pour la réponse. |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 10:41 |
Ou alors les noms des fonctions sont *décorés* à la compilation:
Pour connaitre le nom exact des fonctions exportées, on peut employer des petits softs comme DLLname |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 10:49 |
Dans ScanBin il ne faut pas regarder l'onglet "fonctions importées" mais l'onglet "fonctions exportées" Extrait (il y à 197 fonctions) : Fonctions exportées : E:\FreeImage\WIN32\FreeImage\Dist\FreeImage.dll ==================================================== 0 _FreeImage_AcquireMemory@12 1 _FreeImage_AdjustBrightness@12 2 _FreeImage_AdjustContrast@12 3 _FreeImage_AdjustCurve@12 4 _FreeImage_AdjustGamma@12 5 _FreeImage_Allocate@24 6 _FreeImage_AllocateT@28 7 _FreeImage_AppendPage@8 8 _FreeImage_Clone@4 9 _FreeImage_CloneTag@4 10 _FreeImage_CloseMemory@4 11 _FreeImage_CloseMultiBitmap@8 Comme dans le fichier pdf je trouve bien une fonction "FreeImage_AcquireMemory" j'en déduis (mais bon je bosse dans l'info depuis 20 piges O)))) ) qu'il faut mettre "_FreeImage_AcquireMemory@12" a la place... |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 11:56 |
Salut ! Excusez moi mè cè quoi "ScanBin" ??? Est ce un utilitaire qui s'applique à toutes les DLLs ? Si oui puis je avoir un lien pour le télécharger ??? Le truc cè ke jè téléchargé une DLL qui permet d'intégrer la barre windows dans une appli !!!! Cè la galère totale ! je sè pa par où commencer ! Peut être que cette piste m'aidera. Merci. |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 12:38 |
Merci pour toutes ces informations. J'ai en effet découvert l'onglet en fouillant dans scanbin. C'etait pas tres intuitif....
Par contre ton exemple precedent : ........ AdresseMessage = AppelDLL32(DLLname, "_FreeImage_GetCopyrightMessage@0") Transfert(&CopyrightMessage,AdresseMessage,1023) Info(CopyrightMessage) DéchargeDLL(hDLL) ELSE Erreur("Chargement de la DLL impossible...") END
....Ne fonctionne pas. J'ai une erreur sur le transfert. Je dois avouer que la communication avec les pointeurs et les chaines asciiz n'est pas tres facile à appréhender... |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 13:58 |
Salut, La raison pour laquelle tu as ce message, c'est probablement parceque tu a modifié le code de Philippe PASQUALI et que tu as enlevé la fonction chargedll et le traitement de l'exception.
Si je résume,
voici le code complet, et qui fonctionne en Windev 9 hDLL est un entier DLLname est une chaîne AdresseMessage est un entier CopyrightMessage est une chaîne ASCIIZ sur 1024 =""
DLLname = "C:\FreeImage380Win32\FreeImage\Dist\FreeImage.dll" hDLL = ChargeDLL(DLLname)
IF hDLL>0 THEN AdresseMessage = AppelDLL32(DLLname, "_FreeImage_GetCopyrightMessage@0") WHEN EXCEPTION IN Transfert(&CopyrightMessage,AdresseMessage,1023) Info(CopyrightMessage) VersPressePapier(CopyrightMessage) DO Erreur("Retour non valide...") END DéchargeDLL(hDLL) ELSE Erreur("Chargement de la DLL impossible...") END
Mathieu |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 14:37 |
J'ai oublié de préciser que je suis en WD8.0 ( 01-80315p) et ce code IF hDLL>0 THEN AdresseMessage = AppelDLL32(DLLname, "_FreeImage_GetCopyrightMessage@0") WHEN EXCEPTION IN Transfert(&CopyrightMessage,AdresseMessage,1023) Info(CopyrightMessage) VersPressePapier(CopyrightMessage) DO Erreur("Retour non valide...") END DéchargeDLL(hDLL) ELSE Erreur("Chargement de la DLL impossible...") END
fonctionne et me renvoie dans CopyrightMessage "This program uses FreeImage, a free, open source image library supporting all common bitmap formats. See http://freeimage.sourceforge.net for details" |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 14:42 |
| |
| |
| | | |
|
| | |
| |
Posté le 08 novembre 2005 - 14:53 |
Moi à l'execution j'ai : L'adresse source fournie (0x1009E6F0 sur 1023 octets) est invalide. Elle ne représente pas une adresse mémoire valide en lecture.
Etonnant que ça marche en windev8 et pas en 9... |
| |
| |
| | | |
|
| | |