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 :

utiliser une dll avec des fonctions en C en vb.net


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 130
    Par défaut utiliser une dll avec des fonctions en C en vb.net
    Bonjour,

    Je cherche à comprendre comment dialoguer avec une dll codé en C à partir de VB.net.
    J'ai bien réussi à faire quelques essai es concluant mais j'ai plus l'impression de faire de la bidouille que de réellement comprendre comment cela fonctionne, en fait la ou je peche c'est sur le type de variable à utiliser, voila ci dessous l'appel à 2 fonctions de la dll qui me retourne un résultat cohérent, mais je me demande quand même si je m'y prend correctement.
    Je tiens à préciser que j'ai lu quelques tuto sur le sujet trouvés à l'aide de google mais je reste un peu incertain sur la compréhension que j'ai eu.

    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
        <DllImport("totoApi.dll")> _
        Public Shared function GetApiVersionEx(ByRef API_EX_MAJOR_VERSION As Integer, ByRef API_EX_MINOR_VERSION As Integer) As short
    End function
     
        <DllImport("totoApi.dll")> _
        Public Shared function StartEx(byval pszComName As string, byval ulSpeed As integer, byref phCsc As integer) As short
    End function
     
     
        Dim maj As integer
        Dim min As Integer
        Dim error As short
     
        error = GetApiVersionEx(maj, min)    => ici j'obtiens bien les versions de la dll maj et min, avec "error" = 0 ce qui correspond à un succes de la fonction retourné par la dll
     
     
        Dim x As Integer
        Dim hRw(x) As Integer
     
        error = StartEx("COM4", 0, hRw(x)) => ici j'obtiens "error" = 0 ce qui correspond à un succes de la fonction retourné par la dll et x = 0 ce qui a l'air cohérent
    Voici les fonctions tel quel sont déclarées dans la documentation que j'ai ou dans le .h livré avec la dll:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    short   GetApiVersionEx   (int *piMajorVersion,
                                         int *piMinorVersion);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    short   StartEx           (const char *szPortName,
                                         ULONG ulComSpeed,
                                         CSC_HANDLE *pApiHandle);
    avec comme info dans le doc:

    szPortName Pointer to a zero-terminated string that specifies the name of the communication port
    ulComSpeed Specifies the communication speed, in bits per second, on the serial line
    pApiHandle Pointer to a CSC_HANDLE object that is initialized with the handle to the opened logical device.
    C'est surtout cette dernière variable "CSC_HANDLE *pApiHandle" que j'ai du mal à comprendre comment la déclarer proprement

    J'avais suivi ce tuto https://rp.developpez.com/vb/tutoriels/dll/ mais en suivant le tableau "VI. Correspondance des types" j'aurai eu tendance à déclarer la variable " byval ulSpeed " en Long , mais ca ne fonctionne pas (message d'erreur) pourtant dans le tableau on indique bien qu'un ULONG en C correspond à un Long en VB.net, or cela fonctionne quand je déclare le paramètre en Integer.

    Merci pour vos aides et explications.

    Cdt,
    yaume

  2. #2
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Bonjour,

    En général, il suffit d'ajouter la référence à la DLL dans les références du projet et de préciser les espaces de noms utilisés dans les Imports, soit le plus souvent la Dll elle-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Imports MaDll
    Imports MaDll.CetEspaceDeNom
    L'intellisense devrait t'indiquer en cours de programmation, toutes les méthodes Public de ta Dll.

    Nom : MaDll.png
Affichages : 557
Taille : 34,1 Ko

    Bonne journée ...

  3. #3
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Salut Phil,

    En fait il s'agit d'une dll native et pas un assembly.

  4. #4
    Membre Expert Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Par défaut
    Merci pour l'info Wallace.
    Autrement, ça ne semble pas évident à la lecture du message ..., surtout avec un exemple de DLL nommée "totoApi.dll".
    Et bien tant pis si mon message ne sert à rien .. ferai mieux une autre fois

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 130
    Par défaut
    Bonsoir,

    Concernant le "totoApi.dll" comme il s'agit d'une dll d'une société , je voulais pas trop divulgué le nom.
    Cela étant dit , j'ai un peu progressé sur mon sujet, sans toutefois vraiment être sur de ce que je fais encore une fois.
    Je ne suis pas un pro de la programmation , donc je suis pas forcement familier avec le vocabulaire parfois employé.

    Tout ceci étant dit, je vais peut être situé un peu plus le contexte, ce qui pourra vous aider peut etre à mieux cerner la ou je bloque.

    La dll en question est une dll permettant de comuniquer avec un périphérique lecteur de carte sans contact produite par la société.
    Selon la doc en ma possession elle est en langage C.

    Du coup j'ai réussi à démarrer la communication avec le péripherique grace à la fonction startex grace au code ci dessous, par contre il y a une fonction permettant de récuperer des infos sur le firmware du péripherique que j'ai du mal à faire fonctionner correctement:

    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
    Imports System
    Imports System.Runtime.InteropServices
    Imports CSC_HANDLE = System.uint32
     
     
    Public Partial Class MainForm
     
    'Déinition de la structure CSC_FW_INFO selon le .h fournit avec la documentation et la dll
      Public class CSC_FW_INFO
        Public blVersionName(47) As byte
        Public blPushButtonGD As byte
        Public appStatus As byte
        Public appVersionName(47) As byte
        Public fwExecutionFlag As byte
        Public serialNumber(11) As byte
     End class
     
       <DllImport("totoApi.dll", CallingConvention := CallingConvention.Cdecl, CharSet:=CharSet.none)> _
        Public shared Function sCSCReaderStartEx(byval pszComName As string, byval ulSpeed As integer, byref pApiHandle As CSC_HANDLE) As short
        End Function
     
        <DllImport("totoApi.dll", CallingConvention := CallingConvention.Cdecl, CharSet:=CharSet.none)> _
        Public shared function sCscGetFwInfoEx(byval hCsc As CSC_HANDLE, byval pFwInfo() As byte) As short
        End Function
     
        Public Sub New()
     
            ' The Me.InitializeComponent call is required for Windows Forms designer support.
            Me.InitializeComponent()
     
            Dim retour As Short  ' retour des fonctions de la dll
            Dim reader As CSC_HANDLE  'déclaration du lecteur de carte
            Dim Firmware As New CSC_FW_INFO() 'déclaration de la variable récuperant les données du firmware
     
      'démarrage de la connexion avec le lecteur de carte (port COM, baudrate, handle du reader retourné par la dll à l'ouverture de com)      
    retour = sCSCReaderStartEx("COM4", 9600, reader)
     
    ' récuperation des infos du firmware du reader
    retour = sCscGetFwInfoEx(reader, Firmware.blVersionName)
    Le problème est qu'avec ce code , je récupère uniquement "Firmware.blVersionName" dans un tableau de 48 byte qui contient par exemple la suite d'entier suivante 66 , 111 , 111, 116, 76, 111, 97, 100, 101, 114,..... qui correspond bien à ce que j'attends au final (meme si ce n'est pas sous la bonne forme) puisqu'en code ASCII cela correspond à "BootLoader....."

    Si je modifie mon code ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      Public class CSC_FW_INFO
        Public blVersionName(108) As byte
        Public blPushButtonGD As byte
        Public appStatus As byte
        Public appVersionName(47) As byte
        Public fwExecutionFlag As byte
        Public serialNumber(11) As byte
     End class
    Pour le coup j'arrive à récuperer toutes les infos (blVersionName, blPushButtonGD , appStatus, appVersionName, fwExecutionFlag , serialNumber) dans "Firmware.blVersionName" dans un tableau de 108 byte sous forme décimal.
    J'en conclu donc que la dll me retourne bien l'ensemble des infos que je veux mais n'arrive pas à attribuer les données à mon objet "Firmware"

    Or, je souhaiterai que chaque propriété récupère la valeur qui lui correspond retourné par la fonction de la dll.

    Pour plus de clarté voici ce que contient le .h fournit:

    Code C : 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
    typedef unsigned int    UINT;
    typedef UINT CSC_HANDLE;
    typedef unsigned char   UCHAR;
    typedef char            CHAR;
     
    typedef struct
    {
        char    blVersionName[48];
        UCHAR   blPushButtonGD;
        UCHAR   appStatus;
        char    appVersionName[48];
        UCHAR   fwExecutionFlag;
        UCHAR   serialNumber[12];
     
    } CSC_FW_INFO;
     
    short   sCSCReaderStartEx           (const char *szPortName,
                                         ULONG ulComSpeed,
                                         CSC_HANDLE *pApiHandle);
     
    short   sCscGetFwInfoEx             (CSC_HANDLE apiHandle,
                                         CSC_FW_INFO *pFwInfo);

    Ainsi que dans la doc:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    short sCSCReaderStartEx(const char* pszComName,
                            ULONG       ulSpeed,
                            CSC_HANDLE* phCsc);


    pszComName = Pointer to a zero-terminated string that specifies the name of the communication port, as known by the operating system, where the CSC Reader peripheral is connected. I.e. “COM1” or “\\.\COM13”, “/dev/ttyS0” on Linux

    ulSpeed = Specifies the communication speed, in bits per second, on the serial line.
    The possible values for ulSpeed are 0, 9600, 19200, 57600 and 115200 (default speed). The special value 0 means that the ulSpeed parameter shall not be used, and the default communication speed with the reader shall be used instead.

    phCsc = Pointer to a CSC_HANDLE object that is initialized with the handle to the opened logical device.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    short sCscGetFwInfoEx(CSC_HANDLE hCsc,
                          CSC_FW_INFO *pFwInfo);

    hCsc = Handle to the logical CSC Reader device.

    pFwInfo = Pointer to a CSC_FW_INFO structure in which the firmware information is returned.
    il y a également des exemples pour appeler les fonction mais en C ou C++

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CSC_HANDLE hRw;
     
    err = sCSCReaderStartEx("COM1", 115200, &hRw);
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CSC_FW_INFO fwInfo;
     
    err = sCscGetFwInfoEx(hRw, &fwInfo);
    Voila je sais pas si c'est bien clair, et si j'ai pu apporter les précisions nécessaires pour pouvoir m'aider, pour le moment je tâtonne sur le sujet, certes je cherche à arriver au résultat final, mais aussi à comprendre les erreurs que je fait.
    Merci à vous.

Discussions similaires

  1. Utilisation de booleen avec des fonction en PL SQL
    Par tchoimars dans le forum SQL
    Réponses: 6
    Dernier message: 23/04/2009, 19h17
  2. Réponses: 2
    Dernier message: 01/12/2008, 14h18
  3. [code::blocks] Créer une dll avec des fonctions en C
    Par dewey01 dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 29/09/2008, 15h24
  4. Eclipse : utiliser une DLL avec un plugin view
    Par cloporte dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 04/09/2007, 09h36
  5. Creer une DLL avec des icônes
    Par Larion dans le forum C++Builder
    Réponses: 5
    Dernier message: 13/03/2005, 17h28

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