[R] Problème avec les DLL

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
winux38
Niveau 1
Niveau 1
Messages : 10
Enregistré le : sam. 01 mars 2008 21:22
Status : Hors ligne

[R] Problème avec les DLL

#1

Message 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

Code : Tout sélectionner

EXPORTS function1
EXPORTS square
 
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
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: Probleme avec les DLL

#2

Message 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 :

Code : Tout sélectionner

$var = DllCall($dll,"int","square","int",$var)
La variable $var dans l'appel de la dll, n'est pas définie !!!
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
winux38
Niveau 1
Niveau 1
Messages : 10
Enregistré le : sam. 01 mars 2008 21:22
Status : Hors ligne

Re: [..] Problème avec les DLL

#3

Message 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
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Problème avec les DLL

#4

Message par Tlem »

Etes vous sur que $result est un tableau ?

Sans la dll, difficile de tester !
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Problème avec les DLL

#5

Message 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
winux38
Niveau 1
Niveau 1
Messages : 10
Enregistré le : sam. 01 mars 2008 21:22
Status : Hors ligne

Re: [..] Problème avec les DLL

#6

Message 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
Fichiers joints
dev_cpp.zip
(7.74 Kio) Téléchargé 129 fois
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11791
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Problème avec les DLL

#7

Message 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 ... :shock:

Pour la suite de ce message, sachez que ce forum traite de AutoIt et non du développement des dll !
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Problème avec les DLL

#8

Message 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 ?
winux38
Niveau 1
Niveau 1
Messages : 10
Enregistré le : sam. 01 mars 2008 21:22
Status : Hors ligne

Re: [..] Problème avec les DLL

#9

Message 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
winux38
Niveau 1
Niveau 1
Messages : 10
Enregistré le : sam. 01 mars 2008 21:22
Status : Hors ligne

Re: [..] Problème avec les DLL

#10

Message 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
winux38
Niveau 1
Niveau 1
Messages : 10
Enregistré le : sam. 01 mars 2008 21:22
Status : Hors ligne

Re: [..] Problème avec les DLL

#11

Message 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
Modifié en dernier par ani le sam. 13 juin 2009 19:17, modifié 2 fois.
Raison : Mise en place des balises de code.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Problème avec les DLL

#12

Message par ani »

arf si je savais quoi chercher je l'aurai noté :P

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 ;)
Avatar du membre
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

Re: [..] Problème avec les DLL

#13

Message 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
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1556
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

Re: [..] Problème avec les DLL

#14

Message 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

 
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Problème avec les DLL

#15

Message 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 :o

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 :D
Avatar du membre
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

Re: [..] Problème avec les DLL

#16

Message 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
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Problème avec les DLL

#17

Message 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 ?
Avatar du membre
Vins83
Membre émérite
Membre émérite
Messages : 220
Enregistré le : mer. 25 juil. 2007 17:43
Status : Hors ligne

Re: [..] Problème avec les DLL

#18

Message 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

Code : Tout sélectionner

for $x = 0 to 99999
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
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Problème avec les DLL

#19

Message 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 :o

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

...
Répondre