[R] Utiliser une DLL

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Sea
Niveau 6
Niveau 6
Messages : 219
Enregistré le : ven. 22 juin 2012 18:51
Localisation : France
Status : Hors ligne

[R] Utiliser une DLL

#1

Message par Sea »

Salut tout le monde voila petit problème de compatibilité je souhaiterais dans Scite lors d'un F5(exécution rapide) que mon code sois exécuté en x86 et non en x64 car c'est incompatible avec ma DLL et c'est un peu lourd de devoir compiler à chaque fois pour tester donc comment faire pour changer ce petit réglage?

Merci d'avance :)
Modifié en dernier par Sea le ven. 08 mars 2013 15:01, modifié 4 fois.
Sea
Niveau 6
Niveau 6
Messages : 219
Enregistré le : ven. 22 juin 2012 18:51
Localisation : France
Status : Hors ligne

Re: [..]Changer en x86

#2

Message par Sea »

Il semblerais que la directive #AutoIt3Wrapper_UseX64=n suffise...

Bon par contre j'ai un petit soucis c'est que j'ai un crash en utilisant ma DLL(compiler avec mingw), ma fonction s'exécute correctement puis il me dis Autoit à cessé de fonctionner après :/

je met quand même mon code même si il s'agit du code par défaut de codeblocks

main.cpp
► Afficher le texte
main.h
► Afficher le texte
et mon code Autoit
► Afficher le texte
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Utiliser une DLL

#3

Message par matwachich »

C'est parce que vous ne spécifiez pas le bon protocole d'appel de fonction.
Par défaut, MinGW compile les fonctions en cdecl, et en regardant la doc de DllCall, on voit que pour appeler une fonction en cdecl, il faut faire:

Code : Tout sélectionner

DllCall($test,"none:cdecl","SomeFunction","str","Teeeeesssst")
N'oubliez jamais ce détails, quand une fonction de dll crash sans raison apparente, vérifiez toujours ça. Utilisant beaucoup de dlls, je me suis beaucoup casser la gueule avec ce problème!

Plus de détails: http://en.wikipedia.org/wiki/X86_calling_conventions et http://blogs.msdn.com/b/oldnewthing/arc ... 48616.aspx
Sachez aussi que les 2 plus utilisées sont: stdcall par défaut sur l'API Win32, et cdecl par défaut ailleurs (surtout les projets open sources issus du monde de linux)

Pour compiler votre dll en stdcall, il faut ajouter le mot clé __stdcall dans la déclaration de fonction, ou exactement, je ne m'en souviens pas (google!)
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Sea
Niveau 6
Niveau 6
Messages : 219
Enregistré le : ven. 22 juin 2012 18:51
Localisation : France
Status : Hors ligne

Re: [..] Utiliser une DLL

#4

Message par Sea »

Erfff merci beaucoup pour ton aide comme d'hab c'est les petits détails très cons qui te font le plus chier...

Humm afin de ne pas polluer je vais continuer dans ce sujet.
Je rencontre un petit soucis mais la je pense c'est plus un soucis de C++ qu'autre chose.
Voila je compte faire des fonctions qui lise un entier en C++ et l'utiliser en Autoit.
Pour cela j'ai donc fais ceci en C++

main.cpp
► Afficher le texte

et mon code autoit
► Afficher le texte
Mon type de donnée en autoit est-il le bon? Es-ce possible de passé une référence en autoit comme type?
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Utiliser une DLL

#5

Message par jchd »

Je te sens parti sur une mauvaise piste ou, à tout le moins, une pente savonneuse. En effet, tu sembles oublier que ton code doit être du C et non du C++.
Ce que la bibliothèque std appelle une string est une entité C++, un objet qui n'a rien à voir avec une chaîne C (char *) ni avec une wstr Windows (une chaîne Unicode en UTF-16 comme les chaînes natives AutoIt). Au passage, le fichier en char * ne fonctionnerait pas avec un fichier employant un caractère Unicode > 0xFF.

Oublie ton compilo C++ et n'utilise que du C avec la convention d'appel que tu souhaites (cdecl ou stdcall), en restant cohérent entre définition et invocation.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
matwachich
Membre émérite
Membre émérite
Messages : 986
Enregistré le : lun. 19 oct. 2009 04:04
Localisation : Algérie
Status : Hors ligne

Re: [..] Utiliser une DLL

#6

Message par matwachich »

En gros, je pense que jchd veut dire que entre AutoIt et la DLL, il ne peut y avoir que des types de données standards, et surtout pas d'objets C++ (c'est pour ça que je n'utilise jamais le C++)

Et aussi, je vois que d'après l'appel à la fonction OpenData avec DllCall, vous faite comme si elle retournée non seulement un pointeur (ce est faux, car elle retourne une structure, ou un objet (je répète, je ne suis pas du tout C++)), et en plus, un pointeur sur ifstream, qui est une entité totalement inconnue de AutoIt

Voici comme je ferrai:
► Afficher le texteLa Dll
► Afficher le texteAutoIt
Sortons VW du coté obscure! - La curiosité est un vilain défaut! Cliquez ici
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Utiliser une DLL

#7

Message par jchd »

De plus, si c'est pour lire un entier (ou une structure quelconque) depuis un fichier, autant utiliser les moyens dont dispose déjà AutoIt. Pas besoin d'une DLL pour ça.
Je ne commenterai pas ce cast...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Sea
Niveau 6
Niveau 6
Messages : 219
Enregistré le : ven. 22 juin 2012 18:51
Localisation : France
Status : Hors ligne

Re: [..] Utiliser une DLL

#8

Message par Sea »

Merci matwachich c'est exactement ce que je cherchais que dire à par merci...
C'est vrai que sans l'allocation dynamique ça peut pas marcher.

jchd c'est vrai mais désirant effectuer d'autre type de lecture(lecture d'union, de double etc...) en autoit c'est assez lourd a gérer et surtout très lent donc j'ai voulu faire ces fonctions pour voir si le problème de lenteur est réduite. Sinon bha je ferais tout en C++ mais n'ayant jamais travailler avec les DLL je me suis dis que c'étais l'occasion ;)
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Utiliser une DLL

#9

Message par jchd »

DllCall est aussi très lourd, donc lent.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Sea
Niveau 6
Niveau 6
Messages : 219
Enregistré le : ven. 22 juin 2012 18:51
Localisation : France
Status : Hors ligne

Re: [..] Utiliser une DLL

#10

Message par Sea »

Oui mais j'ai pu faire un test sur 2 appelle une fonction en full autoit gagne de 0.5seconde
Mais par exemple sur 40 appelle de fonction, un dllcall gagne 1,5seconde comparais à ma fonction en full autoit(et ça c'est pour les int... alors pour les float ou la fonction est assez lourd je te dis pas).
Sachant qu'il s'agit parfois de fichiers pesant plusieurs mo, au final je gagne du temps ;)
Répondre