Transcription d'un double pointeur en VB.Net

Résolu
obeltrando - 7 juin 2013 à 09:50
 obeltrando - 10 juin 2013 à 10:11
Bonjour à tous,

Je suis actuellement en train de développer un IHM en VB.Net.
Pour cela j'ai du intégrer une dll écrite en C et je doit utiliser une fonction qui prend en paramètre un double pointeur sur une structure.

Pour faire appel à cette fonction j'ai donc utiliser le code suivant:
<DllImport("CLT.dll", CallingConvention:=CallingConvention.Cdecl)> _
    Public Shared Function clt_New(ByRef pObj As clt_Type, ByVal card As Integer) As Integer
    End Function


Et l'équivalence en C est la suivante:
 clt_New(
clt_Type ** pObj,	// (Out) Handle to CLT Driver
void *Card // (In) Contactless Tester Interface initialized for communications
)


Donc, bien sur j'ai un problème de PInvoke. Comment pourrais-je faire pour rendre compatible l'utilisation de cette fonction en visual basic?

Merci d'avance,

Olivier

3 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
9 juin 2013 à 14:49
Bonjour,

Je n'ai pas la possibilité de tester, mais je dirai de mémoire :
<DllImport("CLT.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Shared Function clt_New(ByRef pObj As IntPtr, ByVal card As Integer) As Integer
End Function

Sub Test()
        Dim unClt_Type As clt_Type = New clt_Type()

        Dim p_Obj As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(GetType(clt_Type)))
        Marshal.StructureToPtr(unClt_Type, p_Obj, False)
        Dim p2p_Obj As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(GetType(IntPtr)))
        Marshal.StructureToPtr(p_Obj, p2p_Obj, False)

        clt_New(p2p_Obj, 1)
End Sub


J'ai juste un doute sur le ByRef dans la déclaration de la fonction.
3
Salut à tous,

CGSI3, CLT.dll n'est pas trouvable sur internet c'est une librairie d'un outils électronique permettant de réaliser des mesures sur des cartes à puces.


Merci pour les informations, j'ai trouvé la solution ou foliv57 ma bien aidé:

 Dim buffer As Integer = 250
        Dim buffer_handle_card As Integer = 1
        ' generating a global handle
        Dim Obj As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(buffer))
        Dim handle_card As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(buffer_handle_card))

        'convert it to an unmanaged pointer
        Marshal.StructureToPtr(buffer, Obj, False)
        Marshal.StructureToPtr(buffer_handle_card, handle_card, False)

        'calling the dll function
        MsgBox(clt_New(Obj, handle_card))

        'removing the unmanaged pointer from the heap
        Marshal.FreeHGlobal(handle_card)
        Marshal.FreeHGlobal(Obj)


Merci à tous pour le temps passé,

Cordialement,

Olivier
3
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
9 juin 2013 à 13:23
Bonjour Obeltrando,

IHM: Interface Homme Machine Tout ce qui permet une communication homme/machine...

Je ne peux pas te répondre sur la notion de double pointeur que tu demande.
voici cependant un lien qui te donnera quelques idées:

http://nico-pyright.developpez.com/tutoriel/vc2005/interop/

Sinon j’espère juste pouvoir t aider a trouver quelque chose de similaire a ce que tu recherche. Pourrais tu me dire ce que tu recherche dans cette DLL?
'CLT.dll' ne donne rien pour moi sur google. (ou sinon donne nous un lien)

Ensuite si tu veux te fabriquer un ami virtuel, tu peux sans aucun pb utiliser OpentK pour l'affichage et OpenCv pour l'acquisition de données par exemple par ta webcam.
Ce sont 2 projets écrit en langue C & dérivée, et utilisable dans vb.net et qui ont de multiples fonctions utilisable.
CGSI3
0
Rejoignez-nous