PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Problème avec une DLL
Problème avec une DLL
Started by gaetan, Dec., 12 2017 12:16 PM - 10 replies
Registered member
7 messages
Posted on December, 12 2017 - 12:16 PM
Bonjour à tous ,

je suis débutant en Windev et je dois travailler avec une DLL,.

je rencontre une difficulté que je n'arrive pas à solutionner, J'arrive à charger ma DLL, exécuter des opérations basiques en passant les fonctions mais je suis incapable de récupérer des données dans un tableau d'une des fonctions .


j’obtiens l'erreur suivante :

erreur à la ligne 38 du traitement Clic sur BTN_SansNom3.
Vous avez appelé la fonction Transfert.
L'adresse source fournie (0x4A2E5704 sur 8 octets) est invalide.

Voici la structure de la fonction :


Int ID_MF_REQUEST (Int *uid_length, UInt8 *uid)

uid_length : Longueur de l’UID en octets (4 – 7 octets)
uid : Tableau qui contiendra l’UID du tag présent dans le champ de l’antenne

Retour
0x00 : Succès, un tag a été identifié
0x11 : Erreur, aucun tag détecté dans le champ de l’antenne


Voici mon début de code :

ptabTabData est un tableau dynamique
nAdresseTableau est un entier système
nTailleDonnées est un entier système



hInst est un entier
hInst = ChargeDLL("IDAPIv2h.dll")



SI hInst = 0 ALORS
Erreur(ErreurInfo())
SINON
nResultat est un entier = 0
nResultat = AppelDLL32("IDAPIv2h.dll","Connect_HID")

nResultat = AppelDLL32("IDAPIv2h.dll","ID_MF_REQUEST",&nTailleDonnées,&nAdresseTableau)

ptabTabData = allouer un tableau de nTailleDonnées réels

Transfert(&ptabTabData,nAdresseTableau,nTailleDonnées)

Trace(TableauInfo(ptabTabData,tiNombreLignes))






AppelDLL32("IDAPIv2h.dll","Disconnect_HID")
DéchargeDLL(hInst)
FIN


Pouvez vous m'aider?

Merci beaucoup ,

Gaëtan
Message modified, December, 12 2017 - 1:08 PM
Registered member
948 messages
Popularité : +30 (92 votes)
Posted on December, 12 2017 - 1:20 PM
Coucou,

&nTailleDonnées doit probablement contenir la dimension de ton tableau

--
In üs we trust - Joyeux noël
Registered member
945 messages
Popularité : +102 (110 votes)
Posted on December, 12 2017 - 1:21 PM
Bonjour
si votre fonction est : Int ID_MF_REQUEST (Int *uid_length, UInt8 *uid)
alors je testerais avec :
nTailleDonnées est un entier // int
ptabTabData est un tableau de 512 entiers sans signe sur 1 octet // UInt8
nResultat = AppelDLL32("IDAPIv2h.dll","ID_MF_REQUEST",&nTailleDonnées,&ptabTabData)

512 octets pour la donnée doit être suffisant....
Registered member
945 messages
Popularité : +102 (110 votes)
Posted on December, 12 2017 - 1:37 PM
Vous auriez l'aide de votre API (voir un exemple en C, C++ ou VB)
Registered member
945 messages
Popularité : +102 (110 votes)
Posted on December, 12 2017 - 2:05 PM
Vu ce que j'ai lu sur le net je testerais :
hndDLL, resAPI, uid_length est un entier système
DllName, PathOfDll, uid sont des chaînes
tab_uid est un tableau de 512 entier sans signe sur 1 octet

PathOfDll = ".........." // à modifier suivant votre installation
DllName = ComplèteRep(PathOfDll) + "IDAPIv2h.dll"

IF NOT fFichierExiste(DllName) THEN
Erreur(ChaîneConstruit("Le fichier %1 n'existe pas !", DllName))
RETOUR
END

hndDLL = ChargeDLL(DllName)
IF hndDLL = 0 THEN
Erreur(ChaîneConstruit("Le chargement de la dll : %1 à échoué !", DllName), ErreurInfo(errComplet))
RETOUR
END

resAPI = API(DllName, "Connect_HID")
IF resAPI <> 0x00 THEN
Erreur("Erreur d'ouverture de la communication avec le lecteur !")
DéchargeDLL(hndDLL)
RETOUR
END


WHEN EXCEPTION IN
resAPI = API(DllName, "ID_MF_REQUEST", &uid_length, &tab_uid)
IF resAPI = 0x00 THEN
Transfert(&uid, &tab_uid, uid_length)
Trace(uid)
ELSE
IF resAPI = 0x11 THEN
Info("Aucun tag détecté dans le champ de l’antenne")
ELSE
Info(ChaîneConstruit("La fonction ID_MF_REQUEST a renvoyé : %1", resAPI))
END
END
DO
Erreur(ErreurInfo(errComplet))
END

AppelDLL32(DllName, "Disconnect_HID")
DéchargeDLL(hndDLL)
Registered member
7 messages
Posted on December, 12 2017 - 2:17 PM
Bonjour Philippe,

un tout grand merci pour ce bout de code,

malheureusement j'obtiens l'erreur suivante :






Il s'agit de cette ligne de votre code :

Transfert(&uid, &tab_uid, uid_length)
Registered member
7 messages
Posted on December, 12 2017 - 2:20 PM
Voici un lien contenant la documentation et des exemples en C :

https://www.idcapt.com/fr/download-nopassword/126

Je ne suis malheureusement pas programmeur, j'ai donc quelque difficultés à interpréter.

Merci pour votre aide
Registered member
7 messages
Posted on December, 12 2017 - 2:51 PM
Bizarrement, le code suivant fonctionne mais me retourne mon UID à l'envers :

nTableau est un entiers sur 8 octets
nTailleDonnées est un entier sur 8 octets
hInst est un entier
hInst = ChargeDLL("IDAPIv2h.dll")

SI hInst = 0 ALORS
Erreur(ErreurInfo())
SINON
nResultat est un entier = 0
nResultat = AppelDLL32("IDAPIv2h.dll","Connect_HID")

nResultat = AppelDLL32("IDAPIv2h.dll","ID_MF_REQUEST",&nTailleDonnées,&nTableau)

Trace((NumériqueVersChaîne(nTableau,"04X")))

AppelDLL32("IDAPIv2h.dll","Disconnect_HID")
DéchargeDLL(hInst)
FIN


il me retourne ceci en valeur hexa 814FAF4A2E5704 alors que la bonne valeur est 04572E4AAF4F81
Registered member
945 messages
Popularité : +102 (110 votes)
Posted on December, 12 2017 - 4:06 PM
essayez votre code avec :
nTableau est un tableau de 7 entiers sans signe sur 1 octet

et regardez en mettant un «stop» après nResultat = AppelDLL32("IDAPIv2h.dll","ID_MF_REQUEST",&nTailleDonnées,&nTableau), la valeur de : nTableau
Registered member
945 messages
Popularité : +102 (110 votes)
Posted on December, 12 2017 - 4:18 PM
dans l'exemple VB il y a :
Dim tmp_array(10) As Byte // 1 byte = {0x00,...., 0xFF}
rst = IDAPIv2.MULTI_ID_MF_REQUEST(mIdReader, uid_len, tmp_array(0))
je testerais avec nTableau est un tableau de 10 entiers sans signe sur 1 octet
Registered member
7 messages
Posted on December, 13 2017 - 10:37 AM
Bonjour Philippe,

Un tout grand merci pour les conseils et le coup de main ,


voici le code qui fonctionne pour moi :
Procedure ID_MF_REQUEST()

resAPI, Uid_length est un entier système
tab_uid est un tableau de 10 entier sans signe sur 1 octet

QUAND EXCEPTIONEXCEPTION DANS

resAPI = API("IDAPIv2h.dll", "ID_MF_REQUEST", &Uid_length, &tab_uid)
SI resAPI = 0x00 ALORS
sUid est une chaîne
POUR i= 1 A 7
sUid = sUid + NumériqueVersChaîne(tab_uid[i],"02X")
FIN

RENVOYER sUid

SINON
SI resAPI = 0x11 ALORS
Info("Aucun tag détecté dans le champ de l’antenne")
SINON
Info(ChaîneConstruit("La fonction ID_MF_REQUEST a renvoyé : %1", resAPI))
FIN
RENVOYER Faux
FIN

FAIRE
Erreur(ErreurInfo(errComplet))
FIN


Je pense qu'il y a un problème avec la DLL elle même car Uid_length doit normalement retourner la longueur de l'uid (entre 4 ou 7 selon la documentation) hors j'obtiens toujours 8... Ce n'est pas gênant pour moi car les tag que j'utilise sont toujours les mêmes, j'ai donc fait une boucle pour obtenir mon UID.

Bonne journée,

Gaëtan