Page 1 sur 1
[R] Problème avec les DLL
Posté : sam. 01 mars 2008 21:34
par winux38
Bonjour
J'essaye de faire un dll qui va etre appelee par un script Autoit et je n'arrive pas a executer la fonction dans la dll ca plante a tous les coups
Ci dessous le script
Code : Tout sélectionner
$dll = DllOpen("mydllgcc.dll")
if($dll = -1) then
msgbox(4096,"ret","dll open - ERROR="&@ERROR&@CRLF)
exit
Else
ConsoleWrite("DLL open succesfully"&@CRLF)
EndIf
$var = DllCall($dll,"int","square","int",$var)
if(@ERROR <> 0) then msgbox(4096,"ret","dll exe error="&@ERROR&@CRLF)
le code de la mydlll.c:
Code : Tout sélectionner
int function1(int a)
{
return a*a;
}
int square(int a)
{
return a*a;
}
le code du fichier .def
et enfin la construction de la dll
Code : Tout sélectionner
gcc -mno-cygwin -c mydll.c
gcc -shared -mno-cygwin -o mydllgcc.dll mydll.o mydll.def -Wl,--export-all-symbols -Wl,--out-implib=mygccdll.dll.a
Creating library file: mygccdll.dll.a
merci de votre aide si vous avez une idee.
J'ai aussi essaye de construire la dll avec visual studio express et j'ai le meme probleme.
-winux38
Re: Probleme avec les DLL
Posté : sam. 01 mars 2008 21:46
par Tlem
Bonsoir.
Juste pour info :
http://www.autoitscript.fr/forum/viewto ... ?f=3&t=595
Ensuite, je ne sais pas si c'est en rapport, mais une chose me choque en lisant votre code, et particulièrement ceci :
La variable
$var dans l'appel de la dll, n'est pas définie !!!
Re: [..] Problème avec les DLL
Posté : sam. 01 mars 2008 23:46
par winux38
Merci pur la reponse rapide. de mon cote j'ai progresse.
Code : Tout sélectionner
$var = 18
$result = DllCall("dev_cpp\projet1.dll","none","HelloWorld")
$result = DllCall("dev_cpp\projet1.dll","int","MySquare","int",$var)
if @error <> 0 then
msgbox(4096,"","error in excuting square("&@ERROR&")")
else
msgbox(4096,"square","square of "&$var&"="&$result[0])
EndIf
avec ce fichier de dll
Code : Tout sélectionner
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
DLLIMPORT void HelloWorld (void)
{
MessageBox (0, "Hello World from the DLL!!", "Hi", MB_ICONINFORMATION);
}
DLLIMPORT int MySquare (int b)
{
char str[100];
sprintf(str,"p= %d ",b);
MessageBox (0, str, "MySquare", MB_ICONINFORMATION);
return (b*b);
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
qui est le template de dev_cpp auquel j'ai ajoute ma fonction MySquare.
laboite de dialogue helloworld s'affiche bien ainsi que celle dans MySquare mais apres ca plante.
j'ai ce message dans scite:
>Running:(3.2.10.0):d:\Program Files\AutoIt3\autoit3.exe "D:\patrick\bourse\test.au3"
!>23:40:41 AutoIT3.exe ended.rc:-1073741819
-Winux38
Re: [..] Problème avec les DLL
Posté : dim. 02 mars 2008 00:42
par Tlem
Etes vous sur que $result est un tableau ?
Sans la dll, difficile de tester !
Re: [..] Problème avec les DLL
Posté : dim. 02 mars 2008 02:03
par ani
super post, merci winux38
j'apprend pas pu testé mais juste une suggestion
DLLIMPORT void HelloWorld (void) = dll,"none","HelloWorld","none"
DLLIMPORT int MySquare (int b) = dll,"int","MySquare","int",b
je visionne l'aide me semblait avoir vu un exemple
Re: [..] Problème avec les DLL
Posté : dim. 02 mars 2008 08:23
par winux38
Merci pour vos reponses.
J'ai essaye avec "none" dans le premier call mais ca ne change rien d'autant plus que none tout seul n'est pas possible il faut lui mettre un dummy parametre pour eviter une erreur de syntaxe.
J'ai attache la le projet dev_cpp de construction de la dll a ce message
a+
-winux38
Re: [..] Problème avec les DLL
Posté : dim. 02 mars 2008 11:19
par Tlem
D'après mes quelques tests, il semble que tout simplement c'est votre appel de 'MySquare' qui provoque ce code de retour.
Le premier appel seul fonctionne à merveille, par contre si vous faite le deuxième appel vous avez le code retour
-1073741819
J'en déduit donc que c'est le code de la dll qui ne convient pas.
En plus il est sensé vous retourner le carré de
$var mais il ne le fait pas ...
Pour la suite de ce message, sachez que ce forum traite de AutoIt et non du développement des dll !
Re: [..] Problème avec les DLL
Posté : dim. 02 mars 2008 13:07
par ani
c'est normal qui ne retourne pas la valeur au carré, le message est placé avant la formule et donc il plante, ta fonction square fonctionne sinon sous dev ? j'ai aucun logiciel pour vérifier la source dev
faudrai regarder du coté des fonction dllstructure , je visionne aussi du coté anglophone
en tout cas merci j'ai pu voir le helloworld c sous autoit

c'est bien du c ?
Re: [..] Problème avec les DLL
Posté : dim. 02 mars 2008 17:22
par winux38
Merci pour la reponse
La dll est bien en C
effectivement le message est avant le calcul mais il etait juste la pour voir si j'arrivai dans la fonction.
J'ai fait d'autres essais en compilant le script et essayer de si attacher avec visual express 2008. comme il n'y a pas d'info de debug (meme si la dll est compilee avec l'option -g) je ne vois pas grand chose excepte que je fais un acces a l'addresse 0 je pense au reour de la dll.
je ne sais si cela peu aider.
J'ai deja regarde sur le site anglais et je n'ai rien trouve qui reponde a mon probleme.
eb attendant merci pour le coup de main.
a+
-winux38
Re: [..] Problème avec les DLL
Posté : lun. 03 mars 2008 19:49
par winux38
Oui evidement c'est le deuxieme appel qui ne marche pas.
D'autre part j'ai bien compris que ce site traite d'autoit et non des dll mais lorsque j'utilise la meme dll avec un programme C je n'ai aucun probleme, tout marche correctement!! ce qui poruve que le probleme vient de l'appel fait par autoit.
De plus j'ai essaye de debugger et visiblement il y a un acces fait a l'adress 0 qui genere l'erreur.
En esperant une solution ou au moins une piste pour chercher.
merci
-winux38
Re: [..] Problème avec les DLL
Posté : lun. 03 mars 2008 22:39
par winux38
J'ai resolu mon probleme. il faut invoquer la dll de la facon suivante:
Code : Tout sélectionner
$result=DllCall("dev_cpp/dll/projet1.dll","int:cdecl","MySquare","int",$var)
au lieu de
Code : Tout sélectionner
$result=DllCall("dev_cpp/dll/projet1.dll","int","MySquare","int",$var)
La difference vient du fait dont la pile est nettoyee apres l'appel a la dll.
mode cdecl nettoyage par l'appelant (mode standard de gcc et linux) mode stdcall nettoyage par l'appelle (mode standard de l'API windows et donc d'autoit).
Ceci explique aussi pourquoi cela marchait avec la fonction HelloWorld car pas de parametres, pas de valeur de rtour et donc pas de probleme de pile.
EN tout cas merci pour ceux qui ont passe un peu de temps sur mon probleme et bon script a tous.
-winux38
Re: [..] Problème avec les DLL
Posté : mar. 04 mars 2008 00:03
par ani
arf si je savais quoi chercher je l'aurai noté
mais il ne retourne pas la valeur b*b ?
en tout cas merci pour ton post, j'ai un peu de mal avec l'anglais et c'est bien dommage
encore merci

Re: [..] Problème avec les DLL
Posté : dim. 16 mars 2008 21:28
par Vins83
Quelqu'un serait comment afficher du texte que l'on aurait mi au préalable dans une dll..
Je sais sortir une image,mais je bute pour du texte mdr...
Merci beaucoup
Re: [..] Problème avec les DLL
Posté : mar. 18 mars 2008 19:19
par sylvanie
[edit]
Laissez tombé ce qui suit j'ai vu plus tard que c'était déjà résolu ^^
[/edit]
Bonjour tout le monde, je reviens après une période d'hibernation avec encore la bouche pateuse ...
Le principal problème est que la dll efait ces exports en cdcl et non en stdcall qui est le mode par défaut d'appel de dllcall.
Pour changer ce mode, il faut le préciser dans la déclaration du type de retour, cf aide et bout de code qui suit :
Code : Tout sélectionner
$dll = DllOpen("Projet1.dll")
if($dll = -1) then
msgbox(4096,"ret","dll open - ERROR="&@ERROR&@CRLF)
exit
Else
ConsoleWrite("DLL open succesfully"&@CRLF)
EndIf
$var=3
$varcarre = DllCall($dll,"int:cdecl","MySquare","int",$var)
if(@ERROR <> 0) then
msgbox(4096,"ret","dll exe error="&@ERROR&@CRLF)
Else
MsgBox(0,"OK","carré de "&$var&" = "&$varcarre[0])
EndIf
Re: [..] Problème avec les DLL
Posté : lun. 07 avr. 2008 00:03
par ani
vins83 a écrit :Quelqu'un serait comment afficher du texte que l'on aurait mi au préalable dans une dll..
Je sais sortir une image,mais je bute pour du texte mdr...
Merci beaucoup
Alors pour afficher du texte qui se trouve dans une dll
c'est tout simple
Déjà dans ta ressource tu dois indiquer comme ci-dessous
Code : Tout sélectionner
STRINGTABLE
BEGIN
1 "StringString premier texte"
2 "StringString deuxième texte"
END
La dll se trouve dans le même répertoire que le script
au lieu de @scriptdir "\Madll.dll" je préfére indiquer = ".\MaDll.dll"
si c'est en racine du script on peut indiquer juste "MaDll.dll"
Code : Tout sélectionner
#include <WinAPI.au3>
$hinstance = _WinAPI_LoadLibraryEx(".\Madll.dll", $LOAD_LIBRARY_AS_DATAFILE)
$LoadString_ID1 = _WINAPI_LoadString($hinstance,1)
msgbox(0,"test",$LoadString_ID1)
_WinAPI_FreeLibrary($hinstance)
et si tu veux pas utiliser le loadlibraryEx
Code : Tout sélectionner
#include <WinAPI.au3>
$hinstance = _WinAPI_LoadLibrary("Madll.dll")
$LoadString_ID1 = _WINAPI_LoadString($hinstance,1)
msgbox(0,"test",$LoadString_ID1,4)
_WinAPI_FreeLibrary($hinstance)
J'espère t'avoir aidé sur ce coup-ci
Ani novice à votre service

Re: [..] Problème avec les DLL
Posté : lun. 07 avr. 2008 06:36
par Vins83
Merci ani,je mets juste un code fonctionnel pour que je gens puisse comprendre facilement:
Code : Tout sélectionner
#include <WinAPI.au3>
$hinstance = _WinAPI_LoadLibraryEx(@SystemDir & "\shell32.dll", $LOAD_LIBRARY_AS_DATAFILE)
$LoadString_ID1 = _WINAPI_LoadString($hinstance,60)
msgbox(0,"test",$LoadString_ID1,2)
_WinAPI_FreeLibrary($hinstance)
#include <WinAPI.au3>
$hinstance = _WinAPI_LoadLibrary(@SystemDir & "\shell32.dll")
$LoadString_ID1 = _WINAPI_LoadString($hinstance,62)
msgbox(0,"test",$LoadString_ID1,2)
_WinAPI_FreeLibrary($hinstance)
Merci Ani
Re: [..] Problème avec les DLL
Posté : lun. 07 avr. 2008 14:24
par ani
ok, étant toujours un novice en la matière la Macro systemdir n'est pas obligatoire dans ton exemple, il faut savoir que le systeme windows c'est exactement ou se trouve c'est librairie
vlà un exemple qui te donne tout les string de cette librairie
Code : Tout sélectionner
#include <WinAPI.au3>
Global $hinstance = _WinAPI_LoadLibrary("shell32.dll")
for $x = 0 to 99999
Global $LoadString_ID1 = _WINAPI_LoadString($hinstance,$x)
If $LoadString_ID1 = "" then ContinueLoop
ConsoleWrite($x & "=" & $LoadString_ID1 & @CR)
Next
_WinAPI_FreeLibrary($hinstance)
Cette ligne
If $LoadString_ID1 = "" then ContinueLoop nous dit si le string est null alors on continu la boucle
voilàvoilà bon codage
Pour ceux qui ont testé l'exemple avec Madll.dll y a quelque chose qui close, le résultat est celui-ci
Code : Tout sélectionner
1=StringString premier texte
2=StringString deuxième texte
65537=StringString premier texte
65538=StringString deuxième texte
Pourtant j'ai indiqué 2 phrase...si quelqu'n peut m'expliquer ?
Re: [..] Problème avec les DLL
Posté : mar. 08 avr. 2008 21:12
par Vins83
ani a écrit :
Code : Tout sélectionner
#include <WinAPI.au3>
Global $hinstance = _WinAPI_LoadLibrary("shell32.dll")
for $x = 0 to 99999 ; le remplacer par un chiffre plus petit
Global $LoadString_ID1 = _WINAPI_LoadString($hinstance,$x)
If $LoadString_ID1 = "" then ContinueLoop
ConsoleWrite($x & "=" & $LoadString_ID1 & @CR)
Next
_WinAPI_FreeLibrary($hinstance)
Pour ceux qui ont testé l'exemple avec Madll.dll y a quelque chose qui close, le résultat est celui-ci
Code : Tout sélectionner
1=StringString premier texte
2=StringString deuxième texte
65537=StringString premier texte
65538=StringString deuxième texte
Pourtant j'ai indiqué 2 phrase...si quelqu'n peut m'expliquer ?
J'ai remarqué ça effectivement,j'ai résolu en modifiant
par
Code : Tout sélectionner
for $x = 0 to 99 ; ou le chiffre correspondant aux lignes a lire dans ta dll[code]
Sinon,une nouvelle question,comment fait on pour écrire dans une dll,es ce possible?
en plus je cherche juste a écrire la date du jour,c'est simple sur un fichier ini,mais là,je bute.
Merci de votre aide
Re: [..] Problème avec les DLL
Posté : mar. 08 avr. 2008 21:29
par ani
Cà n'a rien avoir, que tu change le 99999 à 99, je demandais le pourquoi
Si exemple on appel le string 65537 il affichera la première ligne tout simplement,
De mon coté j'ai compris

et c'est tout simple le max conteneur 65536

numbre magic
Pour t'a question...je l'a trouve étrange.
Y a un terme pour ce genre de chose.
Pour rappel ;;; Une DLL est une bibliothèque contenant des fonctions et divers structures, pour être utilisé plus facilement par un EXE avec ou sans interface utilisateurs
Pour l'écriture, y a d'autre méthode, régedit, texte, xml, ini ect
...