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

VB.NET Discussion :

Déclaration DLL C avec VB.net


Sujet :

VB.NET

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Déclaration DLL C avec VB.net
    Bonjour,

    Je souhaite utiliser une Dll développée en C (Je n'ai pas les sources juste le .h) dans une application VB.net (VB 2008 Express).

    Les fonctions de la Dll fonctionnent déjà dans une application Labwindows/CVI (en C).

    J'ai l'impression que j'appelle mes fonctions de façon équivalentes dans mes applications CVI et VB.
    Mais je voudrais savoir si je fait correctement ma déclaration et mon appel en VB. Mes compétences en VB sont assez minces.

    Déclaration dans le .h de la DLL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Déclaration dans la DLL
    __declspec(dllexport) int M_Connect(char *pszDestIP,unsigned short usPort,unsigned char ucSlaveAddr,int *piCId);
    Code CVI
    Code : 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
    // Code CVI
    int nStatus;
    char pcRemoteIP[16];
    int piCId;
    unsigned short usPort=0;
    unsigned short ucSlaveAddr=0;
     
    // Récupération des paramètres de la connection TCP/IP //
    // Adresse IP : Chaine de caractère
    GetCtrlVal(panelHandle, PANEL_STR_IPADDR, pcRemoteIP);
    // Numéro de port
    GetCtrlVal(panelHandle, PANEL_NUM_PORT, &usPort);
    // Slave adresse
    GetCtrlVal(panelHandle, PANEL_NUM_SLAVE, &ucSlaveAddr);
     
    // Connection
    nStatus = M_Connect(pcRemoteIP, usPort, ucSlaveAddr, &piCId);
    Code VB
    Code : 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
    ' Declaration des fonctions de la DLL '
    Private Declare Function MDB_Connect Lib "LibMasterModbusTCP.dll" (ByRef pszDestIP As Char, ByVal usPort As Short, ByVal ucSlaveAddr As Short, ByRef piCId As Integer) As Integer
     
        ' Init interface '
        Private Sub SupervisorModbus_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim psIPAddress As String
            Dim pcIPAddress As Char()
            Dim nStatus As Integer
            Dim usPort As Short
            Dim ucSlaveAddr As Short
            Dim s_iCId(1) As Integer
     
            ' Récupération des paramètres de la connection TCP/IP '
            ' Adresse IP : TxtIPAddress = TextBox
            psIPAddress = TxtIPAddress.Text
            pcIPAddress = psIPAddress.ToCharArray()
            ' Numéro de port : NumPort = NumericUpDown
            usPort = NumPort.Value
            ' Slave adresse : NumSlaveId = NumericUpDown
            ucSlaveAddr = NumSlaveId.Value
     
            ' Ouverture d'une communication avec le TPLC '
            nStatus = M_Connect(pcIPAddress(0), usPort, ucSlaveAddr, s_iCId(0))
        End Sub
    Merci d'avance pour vos réponses

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    char* => String
    unsigned char => Byte
    unsigned short => UShort


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function MDB_Connect Lib "LibMasterModbusTCP.dll" (ByRef pszDestIP As String, ByVal usPort As UShort, ByVal ucSlaveAddr As Byte, ByRef piCId As Integer) As Integer

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.

    Cependant cela ne fonctionne pas.
    Cela doit venir d'ailleurs.
    Faut-il que je déclare le .lib dans ma solution Visual Basic en plus de mettre ma Dll dans le répertoire de l’exécutable générée ?
    Y a-t-il une option particulière à appliquer ?

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    C'est quoi le message d'erreur ?

    Citation Envoyé par Jérèm32 Voir le message
    Faut-il que je déclare le .lib dans ma solution Visual Basic en plus de mettre ma Dll dans le répertoire de l’exécutable générée ?
    Non, le .lib c'est seulement pour la liaison statique

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tomlev Voir le message
    C'est quoi le message d'erreur ?
    Je n'ai pas de message d'erreur.

    J'ai d'un côté un application CVI qui utilise la même fonction de la Dll qui se connecte à ma cible et de l'autre côté une application VB qui ne se connecte pas.

    Je suis donc en train de chercher ce qu'il me manque pour que cela fonctionne.

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut appel de .dll c en vb.net
    bonjour Jérèm32.

    Prends bien garder de declarer ta fonction dans le fichier .vb grace à l'API DllImport.
    La declaration a pour but de preciser :
    -non seulement le mode de transmission des parametres (byVal ou byRef) comme dit par Pol63 et les types appropries
    -mais egalement la convention d'appel :Cdecl pour le C.
    voici ton code revu:
    Code : 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
    55
     
    'ajoutez une instruction Imports en haut du 
    'code de la classe du formulaire de départ : 
    Imports System.Runtime.InteropServices
    Public Class SupervisorModbus
        'Cette declaration de ta fonction  M_Connect a pour but justement d'eclaircir le mode de transmission des 
        'parametres en Vb.Net;
        '-par valeur =>  ByVal
        '-par reference(adresse)=>ByRef
        '(VBnet :ByRef maVariable as Type<=>C: Type *maVariable)
        '-Convention d'appel :  CallingConvention.Cdecl pour C.
        '-nom du fichier .dll qui contient notre fonction(exemple:Connect.dll) 
        '
        <DllImport("Connect.dll", _
          CallingConvention:=CallingConvention.Cdecl)> _
       Private Shared Function M_Connect( _
       ByRef pcRemoteIP As String, _
       ByVal usPort As UShort, ByVal ucSlaveAddr As Byte, ByRef piCId As Integer) _
       As Integer
            ' Leave the body of the function empty.
        End Function
     
        Private Sub SupervisorModbus_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim psIPAddress As String
            'à virer inutile
            'Dim pcIPAddress As Char()
     
            Dim nStatus As Integer
            Dim usPort As Short
            Dim ucSlaveAddr As Byte
            'à virer
            'Dim s_iCId(1) As Integer 
     
            Dim s_iCId As Integer   'comme dans CVI.
     
     
            ' Récupération des paramètres de la connection TCP/IP '
            ' Adresse IP : TxtIPAddress = TextBox
     
            'psIPAddress = TxtIPAddress.Text
            ' remplacer directement par:
            psIPAddress = TxtIPAddress.Text
     
            ' Numéro de port : NumPort = NumericUpDown
            usPort = NumPort.Value
            ' Slave adresse : NumSlaveId = NumericUpDown
            ucSlaveAddr = NumSlaveId.Value
     
            ' Ouverture d'une communication avec le TPLC '
            'nStatus = M_Connect(pcIPAddress(0), usPort, ucSlaveAddr, s_iCId(0))
            ' remplacer  par:
            nStatus = M_Connect(psIPAddress, usPort, ucSlaveAddr, s_iCId)
     
        End Sub
    End Class
    bon code...............

Discussions similaires

  1. Creer une dll avec VC++ .NET
    Par KindPlayer dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 27/05/2008, 14h48
  2. utiliser une DLL faite en vb6 avec VB.net
    Par j.sineau dans le forum VB.NET
    Réponses: 6
    Dernier message: 10/12/2007, 10h33
  3. DLL itext pour pdf avec vb.net
    Par CosmicGirl dans le forum Général Dotnet
    Réponses: 6
    Dernier message: 31/07/2007, 22h17
  4. [débutant]Utilisez une DLL avec ASP.Net
    Par _Fabien dans le forum ASP.NET
    Réponses: 4
    Dernier message: 20/03/2007, 13h02
  5. Utilisation de dll personelle avec VB.NET
    Par yakay dans le forum VB.NET
    Réponses: 1
    Dernier message: 14/12/2006, 09h18

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