probleme prototype / appel d'une fonction dans une DLL

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Xain
Messages : 7
Inscription : lun. 24/avr./2006 14:11
Localisation : Andolsheim

probleme prototype / appel d'une fonction dans une DLL

Message par Xain »

bonjour.

je dois appeler une fonction qui se trouve dans une dll.

cette fonction est decrite ainsi :

int BTEcritureDatas(char *buffer, int nbcarac)
char *buffer est un pointeur sur un tableau contenant les données à écrire
int nbcarac est le nombre de caracteres contenus dans le tableau à Ecrire.


je me suis basé sur le code que Flype m'a donné lors de mon post precedent, mais ma grande méconnaissance des pointeurs (fais que j'obtiens un "invalid memory acces" pour cette fonction

Code : Tout sélectionner

#BT_DLL = 1
Prototype.l BTEcritureDatas(*ecrire,nbmaxecrit.l)
BTEcritureDatas.BTEcritureDatas=GetFunction(#BT_DLL,"BTStartecritureDatas")
 ecrire="salut"
 BTEcritureDatas(@ecrire,5) ; => le debogueur me signale un invalid memory access


je dois me planter comme une grosse buse sur le prototype.

si quelqu'un peux me donner la solution.

merci d'avance.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

c'est pas simple de te donner la solution sans le matos dans les mains pour tester.

essaye çà pour voir (sachant qu'il manque le OpenLibrary et l'init de la DLL) :

Code : Tout sélectionner

Prototype.l BTEcritureDatas(chaine.s, nCar.l) 

BTEcritureDatas.BTEcritureDatas = GetFunction(#BT_DLL, "BTStartecritureDatas") 

If BTEcritureDatas <> #Null
  BTEcritureDatas("salut", 5) ; ou 6 peut etre à cause du caractere de fin de chaine Chr(0).
EndIf
Image
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je ne vois pas ce qui cloche.

Je sais que ça ne correspond pas à la déclaration en C, mais *buffer ne serait pas un pointeur qui contient l'adresse de la chaine, et pas directement l'adresse de la chaine ?

ce qui pourrait s'écrire en PB

Code : Tout sélectionner

#BT_DLL = 1
Prototype.l BTEcritureDatas(*ecrire,nbmaxecrit.l)
BTEcritureDatas.BTEcritureDatas=GetFunction(#BT_DLL,"BTStartecritureDatas")
 *ecrire = @"salut"
 *pt = @*ecrire
 BTEcritureDatas(*pt,5)
Xain
Messages : 7
Inscription : lun. 24/avr./2006 14:11
Localisation : Andolsheim

Message par Xain »

j'ai trouvé une solution alternative par manque de temps : j'utilise le code que m'a donné Flype pour les fonctions d'ouverture, de fermeture du canal de communication et la lecture des données. Je fais simplement un callfunction pour la lecture des données (issu de mon ancien code). La, ca fonctionne sans aucun probleme, meme si ca fait pas tres propre


avec la modif apportée par Denis, j'ai toujours un invalid memory acces sur BTEcritureDatas(*pt,5).

je dois encore ajouter quelqeus fonctionalités et ca partira en test Prod (interface entre notre ERP et le PC auquel est connecté la douchette).


merci encore.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Xain a écrit : avec la modif apportée par Denis, j'ai toujours un invalid memory acces sur BTEcritureDatas(*pt,5).
merci encore.
Oui, c'était au cas ou car ça ne correspond pas à la définiton, mais parfois les doc sont fausses alors faut tester
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

un truc tout con qu'il faut parfois faire avec l'api windows

au lieu d'envoyer la taille du buffer, on envoi l'adresse d'une variable qui contient la taille du buffer...

à essayer...

Dri
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ah oui - et qui recoit la taille effectivement écrite/envoyé dans le buffer du périph. possible effectivement.

ce qui donnerait quelquechose genre :

Code : Tout sélectionner

ecrire.s = "salut"
nbcar.l = 5

BTEcritureDatas(@ecrire, @nbcar)
Image
Répondre