[Résolu] Passage de paramètres avec la fonction API
Utilisateur WDF
Inscrit:
28/06/2005 15:02
De Aurillac Cantal Auvergne
Post(s): 91
Bonjour à tous,

Je dois communiquer avec une dll afin de récupérer des informations.

Dans cette dll, il y a une fonction ReceiveMsg, avec tout plein de paramètres de types différents (pas mal de pointeurs) et je n'arrive pas à l'appeler correctement.

Voici le prototype de la fonction de la DLL pour un appel en C :

int receiveMsg (char * buffer, int length, int * actualLength, char * eomChar, char * c1c2, long timeout)


Cette fonction permet de récupérer une chaine dans buffer.
-length est la taille de ce buffer
-actualLength est un pointeur sur en entier, dans lequel doit être écrit la taille du message écrit dans buffer après excution de la fonction.
-eomChar et et c1c2 sont 2 pointeurs sur des caractères (ce ne sont pas des chaines, ils contiennent tous 2 1 seul char)

J'appelle cette fonction de la manière suivante sous Windev :

nRes est un entier

sfBufferLoc est une chaîne fixe sur 255
nAdr est un entier = &sfBufferLoc
nEomcharLoc est un entier sur 1 octet
nC1c2Loc est un entier sur 1 octet
nActualLengthLoc est un entier
nLengthLoc est un entier = 255
nTimeOutLoc est un entier = 50


nRes = API(gsDll, "receiveMsg", &sfBufferLoc, nLengthLoc, &nActualLengthLoc, &nEomcharLoc, &nC1c2Loc, nTimeOutLoc)


Je me suis référé à la page d'aide de Windev sur la conversion des types en C pour créer l'appel, mais ça ne fonctionne pas, à chaque fois j'ai "Une erreur système inattendue est survenue", et ça m'énerve ^^

Voici le message d'exception complet :

Erreur à la ligne 30 du traitement Procédure globale ReceiveMsg.
Une erreur système inattendue est survenue.
Si cet incident se produit de manière systématique lorsque vous exécutez les mêmes manipulations, il est conseillé de transmettre au Support Technique Gratuit :
 - une description des circonstances de l'incident
 - les lignes de code, une fenêtre ou un projet permettant de reproduire le problème
 - les informations techniques suivantes

Détails techniques :

Module : WD110VM.DLL
Version du module : 11.00Qd
VI : 01F110054b
Adresse de base : 25E60000
Erreur système : Access violation (GPF)
EIP = 25E6606D
OS : Windows Longhorn (6.0.6000)

Informations techniques

Projet : Composant API

Dump de l'erreur du module <WD110VM.DLL> <11.00Qd>.

- Appel WL :
Traitement de <TASharing.ReceiveMsg>, ligne <30>, thread <0>

- Niveau : erreur fatale (EL_FATAL)

- Code erreur : 1020

- Code erreur WD55 : 0

- Pas de code d'erreur système

- Pas de message d'erreur système

- Que s'est-il passé ?
Une erreur système inattendue est survenue.
Si cet incident se produit de manière systématique lorsque vous exécutez les mêmes manipulations, il est conseillé de transmettre au Support Technique Gratuit :
 - une description des circonstances de l'incident
 - les lignes de code, une fenêtre ou un projet permettant de reproduire le problème
 - les informations techniques suivantes

Détails techniques :

Module : WD110VM.DLL
Version du module : 11.00Qd
VI : 01F110054b
Adresse de base : 25E60000
Erreur système : Access violation (GPF)
EIP = 25E6606D
OS : Windows Longhorn (6.0.6000)

- Infos de debug :
Registres :

  EIP = 25E6606D    EBP = 0012F444
  EAX = 003D00F0    EBX = 01352D88
  ECX = 57203041    EDX = 00000006
  ESI = 01312D10    EDI = 01312D10

Pile des appels :

[WD110VM.DLL (25E60000), 11.00Qd, 01F110054b]	25E6606D
[WD110VM.DLL (25E60000), 11.00Qd, 01F110054b]	25E74D90 : WL_SetParam() + 88731 bytes-> INVALID, stack increased by 4
[???]	01312D10
[WDTST.EXE (00000000), 11.00Al, 01F110053p]	74C08525
Pile invalide


- Infos attachées :
EIT_DATEHEURE : 12/02/2008 13:07:39
EIT_PILEWL :
Procédure globale ReceiveMsg (TASharing.ReceiveMsg), ligne 30
Clic sur BTN_receiveMsg (Fen_TestAPI.BTN_receiveMsg), ligne 10

- Identifiant dans le .err : 1020

Voilà, je suis vraiment bloqué à cause de ça, si vous avez une info, hésitez pas à répondre

Merci d'avance !

Contribution le : 13/02/2008 10:22

Edité par drcharly93 sur 13/2/2008 18:42:54
_________________
La touche F1 est et restera toujours ta meilleure amie :p
Créer un fichier PDF de la contribution Imprimer


Re: Passage de paramètres avec la fonction API
Utilisateur WDF
Inscrit:
28/06/2005 15:02
De Aurillac Cantal Auvergne
Post(s): 91
Oh là là, je suis complètement paumé là ><

Après quelques tests supplémentaires, voilà que la fonction s'exécute sans erreur.

Mais voilà mon appel :


sfBufferLoc est une chaîne fixe sur 255
nLengthLoc est un entier = 254
nEomcharLoc est un entier sur 1 octet
nC1c2Loc est un entier sur 1 octet
nActualLengthLoc est un entier
nTimeOutLoc est un entier = 50

nRes = API(gsDll, "receiveMsg", sfBufferLoc, nLengthLoc, &nActualLengthLoc, &nEomcharLoc, &nC1c2Loc, nTimeOutLoc)


1er constat, la chaine est fixe, et je passe directement la variable et pas son adresse (1er truc très louche)

La fonction s'exécute, j'ai un nActualLengthLoc qui parait correct (79 caractères), jusque ici, tout va bien.

Sauf que mon sfBufferLoc est vide.. Enfin, ça, ça me paraît logique étant donné que je lui passe directement la chaine au lieu de son adresse.

Ce qui ne me parait pas logique en revanche, c'est que je n'ai pas de plantage lorsque je passe la chaîne, et on son adresse, à la fonction. Dans le code C, il attend un pointeur.

Je suis vraiment paumé là :o

Contribution le : 13/02/2008 12:43
_________________
La touche F1 est et restera toujours ta meilleure amie :p
Créer un fichier PDF de la contribution Imprimer


Re: Passage de paramètres avec la fonction API
Animateur WDF
Inscrit:
02/03/2003 04:07
De Noisy le grand(93)
Post(s): 2745
Bonjour,

Théorie,
En C le type chaine n'existe pas réellement mais il s'agit plutôt d'un tableau d'octet

le passage par adresse à partir de WinDev n'est valable normalement que lorsque on attend une valeur en retour , paramètre de type <Out> et non <In>
En règle générale on passe par adresse les types complexes tableaux, objets etc... ainsi que les variables qui doivent retourner des valeurs.

Contribution le : 13/02/2008 15:24
_________________
@A+
Contact (privé)......
email : drcharly@wdforge.org
[DrCharly93]
Créer un fichier PDF de la contribution Imprimer


Re: Passage de paramètres avec la fonction API
Utilisateur WDF
Inscrit:
28/06/2005 15:02
De Aurillac Cantal Auvergne
Post(s): 91
Problème résolu à l'aide d'un confrère d'un autre forum.

La solution :

nRes est un entier

szBufferLoc est une chaîne ASCIIZ sur 2056
szEomcharLoc est une chaîne ASCIIZ sur 2
szC1c2Loc est une chaîne ASCIIZ sur 2
nActualLengthLoc est un entier
nLengthLoc est un entier = 2056
nTimeOutLoc est un entier = 50

nRes = API(gsDll, "receiveMsg", &szBufferLoc, nLengthLoc, &nActualLengthLoc, &szEomcharLoc, &szC1c2Loc, nTimeOutLoc)


Les chaines sont gérées aussi comme des tableaux d'octets en Windev, sauf que c'est caché, contrairement au C ^^

Mon erreur était de penser que szEomcharLoc et szC1c2Loc n'étaient que des octets alors que ce sont des paires d'octets (char[2])

Merci tout de même pour ta réponse !

Contribution le : 13/02/2008 16:31
_________________
La touche F1 est et restera toujours ta meilleure amie :p
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




Enregistrer votre réponse
CompteNom   Mot de passe   Authentification
Message:


Vous ne pouvez pas débuter de nouveaux sujets.
Vous pouvez voir les sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Connexion
Menu
Chercher WDForge
Chercher Web
Partenaires
Visualiser tous les Partenaires...
WinDev, WebDev, WinDev Mobile et HyperFile sont des marques déposées par PCSoft. |  Voter |  Legal |  Contact |   XOOPS 2.0.13.2