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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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