IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

[vb.net] Importation de fonctions export�es d'une DLL c++


Sujet :

C++/CLI

  1. #1
    Membre �clair�

    Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2003
    Messages
    286
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 286
    Par d�faut [vb.net] Importation de fonctions export�es d'une DLL c++
    Salut !

    J'ai une DLL c++ qui exporte une fonction du type :
    Code c++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    int	BTRechercheDevices(
    char		*a_tabNom, 
    int		a_tailleNom,
    unsigned char	*a_tabAddr, 
    int		a_tailleAddr, 
    int		a_nbDeviceMax, 
    unsigned char	a_maskRecherche)

    a_tabNom et a_tabAddr sont des tableaux de tableaux "a_tabNom[20][50]"

    Pourriez-vous m'aider au niveau du marshalling des donn�es ?
    Je suppose que pour le DllImport() il faut que je d�clare les char* en IntPtr et les int en Int32 ?

    Je n'ai pas vraiment trouv� de documentation pour vb.net (il en existe pour C#)

    Merci.

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    F�vrier 2004
    Messages
    19 875
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur .NET
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 19 875
    Par d�faut
    Citation Envoy� par basnifo Voir le message
    Je n'ai pas vraiment trouv� de documentation pour vb.net (il en existe pour C#)
    Ben c'est pareil... si c'est la traduction en VB.NET qui te pose probl�me, utilise le convertisseur

  3. #3
    Membre �clair�

    Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2003
    Messages
    286
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 286
    Par d�faut
    Hello,

    En fait on trouve plut�t de la doc sur du c++/cli que ce que je cherche j'ai l'impression.

    Voila ou j'en suis :

    Code vb : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    <DllImport(DLL_BT_RELEVE, EntryPoint:="BTRechercheDevices")> _
    	  Public Shared Function _BTRechercheDevices( _
    			ByRef a_tabNom()() As Byte, ByVal a_tailleNom As Int32, _
    			ByRef a_tabAddr()() As Byte, ByVal a_tailleAddr As Int32, _
    			ByVal a_nbDeviceMax As Int32, ByVal a_maskRecherche As Char) As Int32
    End Function

    Code vb : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Public Shared Function BTRechercheDevices(ByRef tabNom As String(), ByRef tabAddr As String(), ByVal nbDeviceMax As Integer) As Integer
    	Dim byteTabNom()() As Byte
    	Dim byteTabAddr()() As Byte
    	Dim i As Integer
    	Dim resDll As Int32
     
    	Dim longTabNom As Integer = 50
    	Dim longTabAddr As Integer = 10
     
    	ReDim byteTabNom(nbDeviceMax - 1)
    	For i = 0 To byteTabNom.GetUpperBound(0)
    		ReDim byteTabNom(i)(longTabNom - 1)
    	Next
     
    	ReDim byteTabAddr(nbDeviceMax - 1)
    	For i = 0 To byteTabAddr.GetUpperBound(0)
    		ReDim byteTabAddr(i)(longTabAddr - 1)
    	Next
     
    	resDll = _BTRechercheDevices(byteTabNom, longTabNom, byteTabAddr, longTabAddr, nbDeviceMax, Chr(&HFF))
     
    End Function

    Le probl�me c'est que quand j'appelle la fonction _BTRechercheDevices, il me mets l'erreur suivante :
    Impossible de marshaler 'parameter #3' : Il n'existe aucune prise en charge du marshaling pour les tableaux imbriqu�s.
    Ben oui, mais je fais comment dans ce cas ?

    J'ai lu cet article mais j'avoue ne pas piger comment je dois m'y prendre ...
    http://msdn.microsoft.com/fr-fr/libr...e6(VS.80).aspx

    Merci pour toute aide !

  4. #4
    R�dacteur/Mod�rateur


    Homme Profil pro
    D�veloppeur .NET
    Inscrit en
    F�vrier 2004
    Messages
    19 875
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur .NET
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 19 875
    Par d�faut
    Je pense qu'il faut que tu te cr�es un marshaller personnalis�, en g�rant le tableau imbriqu� via des pointeurs
    Cette discussion pourra peut-�tre t'aider :
    http://forums.msdn.microsoft.com/en-...-3638986d7844/

  5. #5
    Membre �clair�

    Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2003
    Messages
    286
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 286
    Par d�faut
    Merci pour ton lien, mais ca correspondait + ou - � ce que je souhaitais, et pour �tre franc j'ai pas tout compris.

    J'�tais partis sur une autre solution, qui apr�s quelques heures fonctionne et que voici :

    En gros mon tableau � 2 dimensions est consid�r� comme un tableau � 1 dimension ... ca fait un peu de code pourri quoi ...


    Code vb : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    <DllImport(DLL_BT_RELEVE, EntryPoint:="BTRechercheDevices")> _
    	  Public Shared Function _BTRechercheDevices( _
    			ByVal a_tabNom As IntPtr, ByVal a_tailleNom As Integer, _
    			ByVal a_tabAddr As IntPtr, ByVal a_tailleAddr As Integer, _
    			ByVal a_nbDeviceMax As Integer, ByVal a_maskRecherche As Byte) As Integer
    End Function

    Code vb : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    Public Shared Function BTRechercheDevices(ByRef tabNom As String(), ByRef tabAddr As String(), ByVal nbDeviceMax As Integer) As Integer
    	Dim i As Integer
    	Dim resDll As Integer
     
    	Dim byteTabNom() As Byte
    	Dim byteTabAddr() As Byte
    	Dim PtrTabNom As IntPtr 'On crée le IntPtr qui contiendra l'adresse du buffer
    	Dim PtrTabAddr As IntPtr 'On crée le IntPtr qui contiendra l'adresse du buffer
     
    	Dim longTabNom As Integer = 30
    	Dim longTabAddr As Integer = 5
     
    	Dim tabTmpNom() As Byte
    	Dim tabTmpAddr() As Byte
     
     
    	ReDim byteTabNom((longTabNom * nbDeviceMax) - 1)
    	ReDim byteTabAddr((longTabAddr * nbDeviceMax) - 1)
     
    	ReDim tabTmpNom(longTabNom - 1)
    	ReDim tabTmpAddr(longTabAddr - 1)
     
     
    	PtrTabNom = Marshal.AllocHGlobal(longTabNom * nbDeviceMax)
    	PtrTabAddr = Marshal.AllocHGlobal(longTabAddr * nbDeviceMax)
     
    	Marshal.Copy(byteTabNom, 0, PtrTabNom, longTabNom * nbDeviceMax)
    	Marshal.Copy(byteTabAddr, 0, PtrTabAddr, longTabAddr * nbDeviceMax)
     
    	' Recherche BT
    	resDll = _BTRechercheDevices(PtrTabNom, longTabNom, PtrTabAddr, longTabAddr, nbDeviceMax, &HFF)
     
    	Marshal.Copy(PtrTabNom, byteTabNom, 0, longTabNom * nbDeviceMax)
    	Marshal.Copy(PtrTabAddr, byteTabAddr, 0, longTabAddr * nbDeviceMax)
     
    	Marshal.FreeHGlobal(PtrTabNom)
    	Marshal.FreeHGlobal(PtrTabAddr)
     
     
    	' Erreur ou pas de résultat -> on quitte
    	If (resDll < 0) OrElse (resDll = 0) Then Return resDll
     
    	ReDim tabNom(resDll - 1)
    	ReDim tabAddr(resDll - 1)
     
    	For i = 0 To resDll - 1
    		Array.Copy(byteTabNom, i * longTabNom, tabTmpNom, 0, longTabNom)
    		tabNom(i) = TabByte2String(tabTmpNom)
    		Array.Copy(byteTabAddr, i * longTabAddr, tabTmpAddr, 0, longTabAddr)
    		tabAddr(i) = AdresseMAC2HexString(tabTmpAddr)
    	Next
     
    	Return resDll
    End Function

    Je reste ouvert � d'autres solutions plus propres, car � mon avis, y'a moyen de faire mieux (apparemment les structures pourraient faire cette tache si j'ai bien compris mais bon ...)

    Give me your opinion ...

Discussions similaires

  1. [D�butant] Utiliser les fonctions contenues dans une DLL �crite en VB.NET
    Par vg-matrix dans le forum VB.NET
    R�ponses: 1
    Dernier message: 26/11/2012, 23h35
  2. Importation de fonction � partir d'une librairie
    Par lelej dans le forum Langage
    R�ponses: 5
    Dernier message: 02/08/2010, 12h21
  3. [AJAX] importer les fonctions JS d'une page charger par Ajax
    Par hiul dragonfel dans le forum G�n�ral JavaScript
    R�ponses: 0
    Dernier message: 10/07/2008, 23h31
  4. R�ponses: 1
    Dernier message: 01/11/2005, 02h29
  5. R�ponses: 8
    Dernier message: 22/12/2004, 22h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo