A l'aide:comment integrer une DLL avec des pointeur
marko34
Messages postés8Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention24 septembre 2007
-
11 sept. 2006 à 15:24
6SU7
Messages postés3Date d'inscriptionmardi 13 décembre 2005StatutMembreDernière intervention27 avril 2011
-
27 avril 2011 à 14:35
Au secours, je dois utiliser en dotnet une DLL ecrite en C++ et qui bien sur renvoi des pointeurs. J'arrive a l'integrer mais impossible de recuperer les valeur pointées.
la dll s'appelle "liredll.dll"
la fonction est HN_TestPresence(unsigned short cabo,unsigned char * pucstatut)
quelqu'un pourrait il m'indiquer comment lire sous dotnet la valeur pucstatut (enfin la valeur indiquée par le pointeur)
Microsoft semble dire que dans l'appel de la dll, il faut utiliser des integers mais je n'y arrive pas non plus
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 11 sept. 2006 à 15:39
Attention, en quoi est écrite ta dll C++, VC6.0?
Attention à la modification des types de données en .net, un char en .net est sur 2 octets, en VC6, il est sur 1 octet.
Si ta dll est écrite en VC6.0, en vb.net il faut que tu déclare ta fonction avec comme parametre
(byval cabo as UShort, ByRef pucstatut as Byte).
Lorsque tu appeleras ta fonction, la variable passée à la place de pucstatuts sera directemant modifiée par la dll, puisque tu lui passe son adresse (Byref) et que ta dll attend un pointeur (adresse). La dll ira modifier la variable directement dans la mémoire, là ou vb la mise.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 11 sept. 2006 à 16:02
Normal fregolo52.
C'est toute la subtilité du passage de variable.
Pour ton premier paramètre tu attend un pointeur sur une variable "simple" donc en VB tu met ByRef (adresse de la variable)
Pour le second tu attend un tableau (en fait pointeur sur une zone mémoire) donc en VB tu met ByVal parce que tu lui passe le tableau (en fait l'adresse d'une zone mémoire).
Si tu mettais ByRef, tu passerais non pas l'adresse du tableau, mais l'adresse de la zone de la pile ou est stocké l'adresse de la zone mémoire que represente ton tableau.
Je sais, plus simple on peut pas
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
fregolo52
Messages postés1114Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 20214 11 sept. 2006 à 16:16
Ah oui, ok !!! Ca y est j'ai compris.
Après tes explications ça parrait simple
ByVal parce qu'avant d'appeler la fonction, j'ai déclaré dans VB.NET :
Dim tStringBuffer(64) As Byte
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 12 sept. 2006 à 13:16
Ce code marche, rien d'étonnant, il semble à priori correct.
Il aurait été plus interresant d'avoir le code qui marche pas.
Es-tu sur que cette dll est codé pour pouvoir fonctionner avec n'importe quel langage ? Si tu as les sources de la dll, vérifie que les fonctions exportée sont bien déclarées en _stdcall.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 12 sept. 2006 à 19:09
A l'aide de ton code C qui marche, j'ai fais le code ci-dessous. Regarde s'il marche.
<hr size= "2" width="100%" />Declare Function Hn_Init Lib "api_lec.dll" Alias "Hn_Init" ByRef pusMode As UShort, ByRef pucCodeErreur As Byte) As UShort
Declare Function Hn_Lecture Lib "api_lec.dll" Alias "Hn_Lecture" ByVal sTempsAttente As Short, ByRef pcDataOut As Byte, ByRef psLgDataOut As Short, ByRef psEtatCarte As Short, ByRef pusCodeErreur As UShort) As UShort
Dim a, pusMode, pusCdErreur As UShort
Dim pucCode, pcDataOut(0 To 8191) As Byte
Dim sTempsAttente, psLgDataOut, psEtatCarte As Short
pusMode = 0 ' A initialiser avec la bonne valeur
sTempsAttente = 0 ' A initialiser à la bonne valeur
psLgDataOut = CShort(pcDataOut.GetLength(0))
pucCode = 0
psEtatCarte = 0
pusCdErreur = 0
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 13 sept. 2006 à 10:27
Essaye avec pcDataOut() ou pcDataOut, voir si ça résoud ton problème.
Je trouve le message d'erreur bizare. habituellement il veut dire que la fonction n'est pas trouvée dans la dll, c'est à dire qu'elle n'est pas exportée.
Cela signifierait que la dll n'est pas utilisable avec VB amis seulement en C++.
Cependant en cherchant sur le net, hier, j'ai trouver un logiciel qui utilisait une dll du même nom et il été développé en VB5. Ce qui veut dire qu'elle serait utilisable.
S'il s'agit bien de la même dll, dll pour lire des cartes à puces, cartes Sésame Vitale entre autre.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
marko34
Messages postés8Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention24 septembre 2007 13 sept. 2006 à 10:55
oui c'est ca, c'est pour le lecteur de carte vitale. ca me fout un peut les boules car en c ca marche bien.... et que malgres tout tes conseils bein ca marche pas en vb