A l'aide:comment integrer une DLL avec des pointeur

marko34 Messages postés 8 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 24 septembre 2007 - 11 sept. 2006 à 15:24
6SU7 Messages postés 3 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 27 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

Merci de votre aide, je commence a desesperer

17 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 3
11 sept. 2006 à 15:53
Chose allucinante, si ce que casy t'a donné ne marche pas, essaie :

(byval cabo as UShort, ByVal pucstatut as Byte)


J'ai une Dll en C++ compilée avec VS2003 (je pense que c'est à peu près la même chose que VC6)

Et chose allucinant, pour récupérer le buffer, on l'a mis en ByVal.


Dans VB.NET j'ai :

(ByRef iBufferSize As Int32, ByVal strBuffer() As Byte)

Dans me Dll en c++, j'ai :

(int * puiBufferSize, char pcStrBuffer[])


Et c'est bien la Dll qui remplit le buffer et renseigne puiBufferSize, l'IHM en VB.NET traite les infos.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
fregolo52 Messages postés 1115 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 3
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
marko34 Messages postés 8 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 24 septembre 2007
12 sept. 2006 à 12:25
Désolé mais ca ne marche toujours pas.... ca doit pas etre trop loin mais ca veut pas

voila le bout de code qui fonctionne tres bien sous dev c++ et moi je cherche juste a recuperer la valeur pcDataOut
Merci de votre aide

typedef unsigned short (* T_Hn_Init)(unsigned short* pusMode, unsigned short* pusCodeErreur);
typedef unsigned short (* T_Hn_Finir)(unsigned short* pusCodeErreur );
typedef unsigned short (* T_Hn_Lecture)(short sTempsAttente, char* pcDataOut, short* psLgDataOut, short* psEtatCarte, unsigned short* pusCodeErreur);
T_Hn_Init Hn_Init;
T_Hn_Finir Hn_Finir;
T_Hn_Lecture Hn_Lecture;


unsigned short pusMode;
unsigned short pusCodeErreur;
short psLgDataOut;
short psEtatCarte;
char pcDataOut[8192];

int main()   


 {
     Hn_Init = (T_Hn_Init) GetProcAddress(LoadLibrary("api_lec.dll"),"Hn_Init");
     a =Hn_Init(& pusMode, & pusCodeErreur); 
     Hn_Lecture = (T_Hn_Lecture) GetProcAddress(LoadLibrary("api_lec.dll"), "Hn_Lecture");
     psLgDataOut=8192;
     Hn_Lecture(sTempsAttente, pcDataOut,& psLgDataOut, & psEtatCarte, & pusCodeErreur);
 }
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
marko34 Messages postés 8 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 24 septembre 2007
12 sept. 2006 à 13:39
Voila le code qui ne fonctionne pas:








Pour declarer la fonction dll dans un module :

Declare



Function
Hn_Init

Lib



"api_lec.dll"



Alias



"Hn_Init"
(

ByVal
pusMode

As



UShort
,

ByRef
pucstatut

As
byte)

As



Long

puis pour l'appel:

Dim
cabo
As
UShort

Dim pucstatut
As byte
MsgBox(Hn_Init(cabo, pucstatut))

merci
0
marko34 Messages postés 8 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 24 septembre 2007
12 sept. 2006 à 13:41
Pour ce qui est de la DLL, je sais juste qu'elle est codée en C++
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
12 sept. 2006 à 13:52
Attention à la valeur de retour de ta fonction, elle retourne un unsigned short, il faut déclarer comme ceci

Declare
Function Hn_Init
Lib
"api_lec.dll"
Alias
"Hn_Init" (
ByVal pusMode
As
UShort,
ByRef pucstatut
As byte)
As UShort

Ensuite MsgBox(Hn_Init(cabo, pucstatut)) va t'afficher la valeur de retour de ta fonction et non pas les valeurs de cabo ou de pucstatut.

MsgBox(Hn_Init(cabo, pucstatut))   ' Valeur de retour de la dll

MsgBox(pucstatut)   ' Valeur de pucstatut après l'appel de la dll

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
marko34 Messages postés 8 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 24 septembre 2007
12 sept. 2006 à 16:55
ca marche toujours pas j'ai toujours un retour de code erreur qui veut rien dire.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 

        a = Hn_Init(pusMode, pucCode) 
         MsgBox ("Retour : " & a.ToString & vbTab & "Code Erreur : " & pucCode.ToString) 

        a  = Hn_Lecture(sTempsAttente, pcDataOut(0), psLgDataOut, psEtatCarte, pusCdErreur) 
        MsgBox("Retour : " & a.ToString & vbTab & "Code Erreur : " & pusCdErreur.ToString & vbTab & "Etat Carte : " & psEtatCarte.ToString) 

<hr size="2" width="100%" /><small>Coloration syntaxique
automatique</small>

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
marko34 Messages postés 8 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 24 septembre 2007
13 sept. 2006 à 10:10
ca doit vraiment pas etre loin mais je comprend pas...

J'ai le message d'erreur suivant

Impossible de trouver le point d'entrée 'Hn_Lecture' dans la DLL 'api_lec.dll'.

et ca il me l'indique sur le parametre pcDataOut(0) de la ligne suivante


a = Hn_Lecture(sTempsAttente, pcDataOut(0), psLgDataOut, psEtatCarte, pusCdErreur)

merci beaucoup de ton aide casy
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
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 #
0
marko34 Messages postés 8 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 24 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
0
marko34 Messages postés 8 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 24 septembre 2007
19 sept. 2006 à 10:31
Ca y est il y a plus le message d'erreur (je suis un imbécile c'est pas ma faute....)

Par contre la carte n'est tjs pas lue, pourtant il ne transmet pas l'erreur mais ne vas tjs pas regarder si la carte y est
0
kheops2b Messages postés 4 Date d'inscription mercredi 10 septembre 2003 Statut Membre Dernière intervention 30 mars 2007
30 mars 2007 à 11:42
J'ai le meme prb avec Vb 5
Code sources C++ de la dll :

int WINAPI Sodehabi(unsigned char* sNum, unsigned char* sCode)

Vb 5 :

Declare Function Sodehabi Lib "clertm.dll" (ByRef no_b As Byte, ByVal sCode As Byte) As Integer
Sodehabi no_b, sCode

déclaration
Private no_b As String
Dim sCode As Byte

Lors du lancement de Sodehabi j'ai une erreur d'execution de "453"

Impossible de trouver le point DLL &lt;fonction&gt; d'entrée &lt;dans nom de fichier&gt;

Merci pour votre réponse, je galere .............

KheOps
0
6SU7 Messages postés 3 Date d'inscription mardi 13 décembre 2005 Statut Membre Dernière intervention 27 avril 2011
27 avril 2011 à 14:35
Bonjour

Vous avez réussi à intégrer cette dll depuis ?

Vous avez encore le code complet qui fonctionne en C++ ?

Merci
0
Rejoignez-nous