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 :

Appel de Fonctions DLL


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Par défaut Appel de Fonctions DLL
    Bonjour,

    Je cherche à créer un client de Messagerie. Pour ceci j'ai développé une bibliothèque de fonctions de gestion du protocole POP en C.

    Pour ce qui est de l'interface graphique, je me suis tourné vers Visual Basic.

    Ce qui me pose problème actuellement :
    Une de mes fonctions C est censée récupérer l'en-tête de chacun de mes mails, l'analyser pour en sortir les infos importantes (Expéditeur, Date, Objet...) via la commande POP3 TOP.

    Signature de la fonction utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int pop_msgs_details_vb(int socket,struct bal *mailb);
    La structure bal est une liste classique (pointeur vers le premier et le dernier element, et taille) pointant vers une chaine de structures de type mail réprésentant chaque message du dépot de courrier et ses infos que je cherche à récupérer.
    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
    /* Description d'une BAL */
    struct bal
    {
    	struct mail *debut;
    	struct mail *fin;
    	int nb_msgs;
    };
     
    /* Description d'un mail */
    struct mail
    {
    	int num;
    	int size;
    	char *expediteur;
    	char *time;
    	char *subject;
    	struct mail *next;
    };
    Pour ce qui est C et construction de la DLL aucun soucis.

    Par contre, je n'arrive pas à appeler la fonction depuis VB.
    J'ai spécifié les types coté 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
     
    ' Type BAL pour stocker les différents messages
        Public Structure BAL
            Dim debut As Int32
            Dim fin As Int32
            Dim nb_msgs As Integer
        End Structure
     
        ' Type MSG décrit la structure d'un message
        Private Structure MSG
            Dim num As Integer
            Dim size As Integer
            Dim expediteur As String
            Dim time As String
            Dim subject As String
            Dim suiv As Int32
        End Structure
    Déja qqun pourait-il me confirmer que mes déclarations par rapport aux pointeurs sont correctes (j'ai eu raison de remplacer par Int32 ?)

    Ensuite, L'Appel de la fonction me plante sur une exception "MarshallDirectiveException"... Pourquoi ?

    Ma Déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function pop_previs_msg Lib "PopClient.dll" ByRef boite As BAL)
    Mon Appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If (erreur = pop_previs_msg(mailbox)) Then (...)
    Je ne comprends pas trop le concept qui vise à "Marshaller" la fonction..

    Merci pour vous 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 : 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
    ça va pas vraiment répondre à ta question, mais ... ça aurait pas été plus simple de faire directement le client POP en VB.NET ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Par défaut
    Bonjour à toi...

    Euh sans aucun doute ça aurait été plus simple, mais pour la portabilité avec les environnements Linux, à chacun son interface graphique avec sa bibliothèque...

    Puis "pour l'exercice" j'aurais aimé avoir une petite expérience d'appels d'objets "non-primitifs" avec Visual Basic.

    Il aurait aussi été plus simple de faire retourner le contenu du "TOP" par la fonction, et de l'analyser ensuite avec VB pour me faire le truc tranquillement et ne communiquer aucune structure, mais j'y ai renoncé, principalement pour les 2 raisons évoquées ci-dessus

    J'espère trouver un accro de l'appel DLL...

    Merci

  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
    Il y en a quelques-uns qui trainent sur le forum ;-)

    En attendant qu'ils passent par ici tu peux regarder le tutoriel de nico-pyright sur le sujet :
    http://nico-pyright.developpez.com/t...c2005/interop/
    http://nico-pyright.developpez.com/t...2005/interop2/

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Par défaut
    Merci à toi Tomlev pour m'avoir éclairé et aiguillé sur le sujet.

    Toutefois, je me suis résolu à changer un peu ma manière de faire les choses, principalement pour éviter beaucoup de complexité, et de problèmes.

    Je travaille maintenant ainsi :
    j'appelle la fonction me retournant le résultat de la commande TOP comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int pop_top(int socket,char *reponse);
    Je dois donc depuis VB passer une chaine de caractère, mise à NULL par exemple, la fonction s'occupe de la réallouer pour moi, et de placer le retour socket dedans. OK jusque là.

    Donc coté VB.net celà donne :

    Déclaration de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare Function pop_top Lib "PopClient.dll" (ByVal num_msg As Integer, ByRef ptrChaine As IntPtr) As Integer
    Bon ? Pas Bon ? pourquoi ?

    Appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     ' Initialisation d'un Pointeur à NULL
                        Dim ptr As IntPtr = IntPtr.Zero
                        ' Appel de la fonction pop_top
                        erreur = pop_top(1, ptr)
                        If erreur = 0 Then
                            ' Stockage de la chaine pointée
                            Dim s2 As String = Marshal.PtrToStringBSTR(ptr)
                            ' Libération de la zone mémoire
                            Marshal.FreeBSTR(ptr)
                            ' Affichage
                            MailTextBox.Text = s2
                        Else (...)
    J'ai suivi l'excellent et que je recommande par rapport à ces problèmes : http://www.sharevb.net/Les-API-en-VB-Net.html

    Il précisait d'utiliser "ByVal <MarshalAs(UnmanagedType.LPStr) param As String" pour passer un "char *" mais impossible avec VB.net 2008 de l'utiliser comme ceci. Je me suis donc résolu à la technique pointeur.

    En exécutant le code je me prends une AccessViolationError :

    L'exception System.AccessViolationException n'a pas été gérée
    Message="Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."

    Que pensez-vous de la méthode.. ? (Methode qui ne marche pas )

    En vous remerciant pour vos réponses.

  6. #6
    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
    Les chaines en .NET sont immuables, elles ne peuvent pas être modifiées. Et c'est probablement ce que ta fonction C essaie de faire... Il faut que tu passes un StringBuilder en paramètre de la fonction, initialisé avec une capacité suffisante.
    Par contre si la fonction C alloue le buffer elle-même, je ne pense pas que ça puisse marcher... je crois que tu vas devoir gérer le marshalling "à la main", en passant un pointeur à la fonction par référence. Ensuite tu copies les données à partir de ce pointeur dans un buffer (avec Marshal.Copy), et tu décodes la chaîne à partir du buffer avec Encoding.GetString.

    Bienvenue dans le monde merveilleux de l'interop

Discussions similaires

  1. [Débutant] Appeler une fonction DLL C# depuis le C++ par API LOADLIBRARY
    Par yann458 dans le forum C#
    Réponses: 3
    Dernier message: 07/05/2013, 23h49
  2. vérification liaison RS232 avec VB6 avec appel au fonction .dll
    Par tatawissa dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 11/04/2013, 17h47
  3. [Débutant] Détourner un appel de fonction DLL dynamique
    Par let_me_in dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 28/05/2007, 23h02
  4. Appels fonctions DLL
    Par Micka91 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 17/02/2004, 17h32
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

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