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# Discussion :

DllImport d'une DLL en C


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 143
    Points : 38
    Points
    38
    Par défaut DllImport d'une DLL en C
    Bonjour,

    Je tente de faire du P/Invoke à partir d'une DLL écrite en C.

    Le but est d'implémenter, dans une application C#, un protocole de messagerie sécurisé (déjà utilisé sur nos calculateurs Vax).
    La méthode posant problème (j'ai le même soucis sur les autres méthodes de la DLL) a pour but de retourner : la liste des projets, et le nombre de projets définis sur le système (en lisant les infos écrites dans un fichier XML).

    Voilà la méthode que j'ai écrite dans mon application C# appelant la méthode IPSec_ListProjet:
    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
     
    using System;
    using System.Runtime.InteropServices;
     
    namespace PInvokeTest
    {
        class PlatformInvokeTest
        {
            [DllImport("IPSecureClt.dll", EntryPoint = "IPSec_ListProjet")]
            public static extern int IPSec_ListProjet(
                [In][Out][MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPTStr)] ref string[] cListeProjets,
                int lNbElement,
                [In][Out]ref int lNbProjets
                );
     
            static void Main(string[] args)
            {
                const int NbElement = 10;
                string[] Projet = new string[NbElement];
                int NbProjet = 0;
     
                int ret = IPSec_ListProjet(ref Projet, NbElement, ref NbProjet);
                Console.WriteLine("Retour appel fonction : {0}", ret);
     
                for (int i = 0; i < NbProjet; i++)
                {
                    if (Projet[i].Length > 0)
                    {
                        Console.WriteLine("Projet {0} sur {1} : {2}", i + 1, NbProjet, Projet[i]);
                    }
                }
     
                Console.ReadLine();
     
            }
        }
    }
    Et voici le prototype C fournit avec la DLL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    long IPSec_ListProjet (char cListeProjets[][256+1], const unsigned long lNbElement,
    unsigned long *lNbProjets);
    La méthode IPSec_ListProjet me retourne une erreur comme ci elle n'arrivait pas à ouvrir ou décoder le fichier XML.
    Du coup, ma liste de projets est vide alors que mon fichier XML en contient un.

    Si l'application implémentant le protocole de messagerie est écrite en C, cela fonctionne parfaitement.
    Je pense donc avoir un problème dans le marshalling.

    Pourriez-vous m'aider ?

    Cordialement,
    Erwan

  2. #2
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 143
    Points : 38
    Points
    38
    Par défaut
    J'ai avancé un peu sur le sujet.

    Tout d'abord, il se trouve que je me basais sur une mauvaise version de la DLL (version x86 alors qu'il existe une version x64 adaptée à mon poste).
    De plus, j'ai modifié un peu mon code : j'ai passé le 1er argument de ma méthode appelée comme un pointeur.

    Avec ces 2 actions, le code retour de ma méthode appelée est correcte.
    J'ai le bon nombre de projets retourné, mais il me faut désormais décoder en string mon pointeur afin d'avoir le nom des projets.
    Et là, j'ai besoin de votre aide car au mieux (en utilisant "Marshal.PtrToStringAnsi()"), j'ai une chaîne vide.

    Merci d'avance,
    Erwan

    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
     
    using System;
    using System.Runtime.InteropServices;
    using System.Text;
     
    namespace PInvokeTest
    {
        class PlatformInvokeTest
        {
            [DllImport("IPSecureClt_x64.dll", EntryPoint = "IPSec_ListProjet")]
            public static extern int IPSec_ListProjet(
                [In][Out] ref IntPtr cListeProjets,
                int lNbElement,
                [In][Out]ref int lNbProjets
                );
     
            static void Main(string[] args)
            {
                const int NbElement = 10;
                string[] Projet = new string[NbElement];
                IntPtr pListeProjet = new IntPtr();
                pListeProjet = IntPtr.Zero;
                int NbProjet = 0;
     
     
                int ret = IPSec_ListProjet(ref pListeProjet, NbElement, ref NbProjet);
     
                Console.WriteLine("Retour appel fonction : {0}", ret);
     
                for (int i = 0; i < NbProjet; i++)
                {
                    Projet[i] = Marshal.PtrToStringAnsi(pListeProjet);
                    if (Projet[i].Length > 0)
                    {
                        Console.WriteLine("Projet {0} sur {1} : {2}", i + 1, NbProjet, Projet[i]);
                    }
                }
     
                Console.ReadLine();
     
            }
        }
    }

Discussions similaires

  1. Extraire les icônes d'une DLL
    Par Globus dans le forum MFC
    Réponses: 6
    Dernier message: 13/09/2002, 14h44
  2. pb de récup de handle à partir d'une dll
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2002, 13h29
  3. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 10h19
  4. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 11h07
  5. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 22h07

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