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

Signaler
Messages postés
8
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
24 septembre 2007
-
Messages postés
3
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
27 avril 2011
-
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

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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 #
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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 #
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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
Messages postés
8
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
24 septembre 2007

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);
 }
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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 #
Messages postés
8
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
24 septembre 2007

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
Messages postés
8
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
24 septembre 2007

Pour ce qui est de la DLL, je sais juste qu'elle est codée en C++
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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 #
Messages postés
8
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
24 septembre 2007

ca marche toujours pas j'ai toujours un retour de code erreur qui veut rien dire.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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 #
Messages postés
8
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
24 septembre 2007

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
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
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 #
Messages postés
8
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
24 septembre 2007

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
Messages postés
8
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
24 septembre 2007

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
Messages postés
4
Date d'inscription
mercredi 10 septembre 2003
Statut
Membre
Dernière intervention
30 mars 2007

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
Messages postés
3
Date d'inscription
mardi 13 décembre 2005
Statut
Membre
Dernière intervention
27 avril 2011

Bonjour

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

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

Merci