[..] Problèmes lors d'appels à API dans une DLL

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
xavierha
Niveau 3
Niveau 3
Messages : 31
Enregistré le : mer. 21 sept. 2011 23:08
Localisation : Atlanta, GA
Status : Hors ligne

[..] Problèmes lors d'appels à API dans une DLL

#1

Message par xavierha »

Pour un projet d'automation de verification des proprietes de travaux d'impression, j'ai besoin d'obtenir des renseignements d'une DLL ecrite en C++ qui se situe sur mon ordinateur, et communique avec un serveur d'impression sur le reseau.
La connexion semble reussir, l'appel a l'API INIT_connectToNonStandardServer retourne 0 (succes), mais il devrait peupler le parametre HarmServerHandle qui reste vide, le nombre de travaux d'impression trouves est toujours 0, et le tableau d'ID de travaux est toujours retourne vide. Si je me sers des memes appels en C++, il y a des travaux qui attendent. Il y a quelquechose que je ne dois pas envoyer correctement. Je me suis arrache les cheveux trop longtemps, et ma femme n'aprouve pas :roll: . Il est temps de demander de l'aide.
► Afficher le texte
Modifié en dernier par xavierha le jeu. 02 févr. 2012 17:16, modifié 3 fois.
Avatar du membre
ZDS
Membre émérite
Membre émérite
Messages : 554
Enregistré le : jeu. 10 juin 2010 10:35
Localisation : 22300 Cul-d'chouette Langue-de-vache
Status : Hors ligne

Re: [..] problemes lors d'appels a API dans une DLL

#2

Message par ZDS »

Bonjour,

C'est une demande beaucoup trop axée sur les propriétés de ta Dll (que nous n'avons pas) pour que quelqu'un puisse t'aider sur ton problème. Il s'agit à mon avis d'une erreur d'étourderie qui aurait pu se glisser dans les différents appels, genre un word en dword ou un int en int32/64 ou autre... bref.

Si c'était possible pour toi de déposer le code C++ fonctionnel ici, afin que je puisse comparer les appels, ça ferait sans doute avancer le schmilblick :)

A bientôt !
ZDS : Chef de projet du nAiO (logiciel AutoIt gratuit sous licence CC 4.0 BY-NC-SA)
Tout problème a une solution, donc si il y a pas d'solution, c'est qu'il y a pas d'problème !
xavierha
Niveau 3
Niveau 3
Messages : 31
Enregistré le : mer. 21 sept. 2011 23:08
Localisation : Atlanta, GA
Status : Hors ligne

Re: [..] problemes lors d'appels a API dans une DLL

#3

Message par xavierha »

J'ai ajoute le prototype du premier API (celui de la connexion), la declaration de la structure en C de HarmServerHandle, et le code qui appelle l'API en C++. La structure HarmServerHandle est censee etre peuplee par l'API lors de l'appel. L'API retourne 0 pour succes, mais ne peuple pas la structure. Si je vais pas a pas dans l'execution du programme en C++, la structure est peuplee correctement.
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: [..] Problèmes lors d'appels à API dans une DLL

#4

Message par jchd »

La convention d'appel me semble erronée (a priori) :
;C++ prototype: int32 MSWSTDCALL INIT_connectToNonStandardServer( blah, blah ...
et tu fais :
DllCall ( $DllHnd, "int:cdecl", "INIT_connectToNonStandardServer",

Au pif, je dirais que MSWSTDCALL est une macro qui correspond finalement à une convention stdcall et pas cdecl. Si ce n'est pas le cas, la tortue qui a écrit ça a intérêt à avoir une carapace en titane sinon, perso, je la lui trouerais à la perceuse...
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
xavierha
Niveau 3
Niveau 3
Messages : 31
Enregistré le : mer. 21 sept. 2011 23:08
Localisation : Atlanta, GA
Status : Hors ligne

Re: [..] Problèmes lors d'appels à API dans une DLL

#5

Message par xavierha »

Tu as raison. J'ai enleve le ":cdecl" du code. Mais le resultat ne change pas :? . mswstdcall est a cause de l'environnement
#ifdef WIN32
#define MSWSTDCALL __stdcall
#else
#define MSWSTDCALL
#endif
et mon environnement est 64 bits.
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: [..] Problèmes lors d'appels à API dans une DLL

#6

Message par jchd »

Que vaut @error immédiatement après l'appel à DllCall ?
Ensuite, si l'on compare les arguments de la fontion C et ceux que tu passes dans ce DllCall, on trouve de grosses différences :

Code : Tout sélectionner

;C++ prototype: int32 MSWSTDCALL INIT_connectToNonStandardServer(const char *hostname,const char *username,const char *password,const char *protocol,int32 port,int32 trpc_version,int32 timeout_seconds,HarmServerHandle *handle,HarmNBTicket *nbticket) ;


    Dim $Ret = DllCall (  $DllHnd, "int", "INIT_connectToNonStandardServer", _
        "char*", $IPAddress,    _   ; nom hote
        "char*", $User, _           ; nom utilisateur
        "char*", $Password, _       ; mot de passe
        "char*", $empty, _          ; nom d'application qui appelle       <<<<<<<<<<<<
        "char*", $empty, _          ; cle de l'application qui appelle      <<<<<<<<<<<<
        "char*", $Prot, _          ; protocole
        "int", -1, _                ; port
        "int", -1, _                ; version protocole
        "int", -1, _                ; delai max en secondes
        "ptr", $p_SvrHnd, _        ; HarmServerHandle
        "ptr", GetEmptyHTicketPtr() _;$p_HarmNBTicket
    )
Enfin, quel est la définition de HarmNBTicket (en C) ?
Que passes-tu pour ce paramètre ?
► Afficher le texte
Il y a d'autres endroits où tu fais ça.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
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: [..] Problèmes lors d'appels à API dans une DLL

#7

Message par jchd »

Que vaut @error immédiatement après l'appel à DllCall ?
Ensuite, si l'on compare les arguments de la fontion C et ceux que tu passes dans ce DllCall, on trouve de grosses différences :

Code : Tout sélectionner

;C++ prototype: int32 MSWSTDCALL INIT_connectToNonStandardServer(const char *hostname,const char *username,const char *password,const char *protocol,int32 port,int32 trpc_version,int32 timeout_seconds,HarmServerHandle *handle,HarmNBTicket *nbticket) ;


    Dim $Ret = DllCall (  $DllHnd, "int", "INIT_connectToNonStandardServer", _
        "char*", $IPAddress,    _   ; nom hote
        "char*", $User, _           ; nom utilisateur
        "char*", $Password, _       ; mot de passe
        "char*", $empty, _          ; nom d'application qui appelle       <<<<<<<<<<<<
        "char*", $empty, _          ; cle de l'application qui appelle      <<<<<<<<<<<<
        "char*", $Prot, _          ; protocole
        "int", -1, _                ; port
        "int", -1, _                ; version protocole
        "int", -1, _                ; delai max en secondes
        "ptr", $p_SvrHnd, _        ; HarmServerHandle
        "ptr", GetEmptyHTicketPtr() _;$p_HarmNBTicket
    )
Enfin, quel est la définition de HarmNBTicket (en C) ?
Que passes-tu pour ce paramètre ?
► Afficher le texte
Il y a d'autres endroits où tu fais ça.

Enfin, relis la doc de DllCall pour voir comment récupérer les paramètres changés par l'appel.
► Afficher le texte
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
xavierha
Niveau 3
Niveau 3
Messages : 31
Enregistré le : mer. 21 sept. 2011 23:08
Localisation : Atlanta, GA
Status : Hors ligne

Re: [..] Problèmes lors d'appels à API dans une DLL

#8

Message par xavierha »

jchd,
tu as raison, il y a plusieurs API pour la connexion initiale, et j'ai melange les choses :oops: . J'ai enleve les 2 lignes, et ajoute SetError(0) avant l'appel. L'erreur est 1 (ne peut pas utiliser la DLL). D'apres ce que j'ai vu sur Google, les raisons typiques de ce genre d'echec sont soit le probleme de 32/64 bits, soit des problemes avec les parametres ou la valeur retournee. J'ai elimine le premier cas en essayant #AutoIt3Wrapper_UseX64=n.
La compatibilite officielle de la DLL est avec C++ et Java. Elle devrait donc etre suffisamment standard pour AutoIT, du moins j'espere.
HarmNBTicket est de ce type:
typedef struct
{
int_pt ID ;
HarmServerHandle *server_handle ;
} HarmNBTicket ;
NB veut dire "non blocking", et on passe une structure vide que la DLL remplit si on ne veut pas bloquer le statut des travaux d'impression pendant l'execution des requetes. Si on passe NULL, les travaux sont bloques dans une image statique de ce qui se passe sur le serveur, et les infos qu'on recoit par la suite sont depuis cette image statique.
Répondre