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 :

Acces Violation dll C


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut Acces Violation dll C
    Bonjour,

    Dans le cas d'un interfaçage avec une dll c via P/invoke, je me trouve devant un souci de marshalling sur des Byte[][] contenus dans une structure.

    Déclaration de la structure dans le .h de la dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct CPS_InfosPorteur {
      UINT8 CodeCivilite    [2];
      UINT8 NomPatronym     [27];
      UINT8 NomMarital      [27];
      UINT8 Prenoms         [3][27];
      UINT8 PrenomUsuel     [27];
      UINT8 CodeLangues     [4][2];
      } CPS_InfosPorteur ;
    Ma déclaration en c#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       struct CPS_InfosPorteur 
        {
          public Byte[] CodeCivilite;    // [2];
          public Byte[] NomPatronym;     // [27];
          public Byte[] NomMarital;      // [27];
          public Byte[][] Prenoms;       // [3][27];
          public Byte[] PrenomUsuel;     // [27];
          public Byte[][] CodeLangues;   // [4][2];
         }
    Lorsque j'appelle la méthode de la dll, je me prend une exception de marshalling.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Impossible de marshaler le champ 'Prenoms' de type 'TestCSharp.CPS_InfosPorteur' : Il n'existe aucune prise en charge du marshaling pour les tableaux imbriqués.
    Comment remédier à cela?

    Pour info, j'ai trouvé une parade qui semble fonctionner mais je préférerais ne pas l'utiliser. Au lieu, de passer à ma fonction une structure "CPS_InfosPorteur" contenant des Byte[][], je lui passe un Byte[] dont la taille est égale à la somme des tailles des elements contenus dans ma structure (soit 172).
    Mais aprés exécution de la fontion, je dois à la main extraire les données de mon Byte[] pour les remettre dans ma structure...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    Suite à ce post, je pense avoir résolu mon pb de marshalling bien que j'ai tjrs un pb...
    Voici les modifs que j'ai faite:

    Dans ma fichier de déclaration
    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
    /* InformationsPorteur */
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct CPS_InfosPorteur 
        {
          public Byte[] CodeCivilite;                               // [2];
          public Byte[] NomPatronym;                                // [27];
          public Byte[] NomMarital;                                 // [27];
          [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
          public PrenomsArray[] Prenoms;                            // [3][27];
          public Byte[] PrenomUsuel;                                // [27];
          [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
          public CodesLanguesArray[] CodeLangues;                   // [4][2];
        }
     
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct PrenomsArray
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 27)]
            public Byte[] Prenom;
        }
        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct CodesLanguesArray
        {
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
            public Byte[] CodeLangue;
        }
    Dans la fonction qui appelle la dll
    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
     
    CPS_InfosPorteur Porteur = new CPS_InfosPorteur();
    Porteur.CodeCivilite = new Byte[2];
    Porteur.NomPatronym = new Byte[27];
    Porteur.NomMarital = new Byte[27];
    Porteur.Prenoms = new PrenomsArray[3];
    for (int i = 0; i < 3; i++)
    {
         Porteur.Prenoms[i].Prenom = new Byte[27];
    }
    Porteur.PrenomUsuel = new Byte[27];
    Porteur.CodeLangues = new CodesLanguesArray[4];
    for (int i = 0; i < 4; i++)
    {
           Porteur.CodeLangues[i].CodeLangue = new Byte[2];
    }
     
     
    CpsCmdReturnValue = ApiCps.CPS_InformationsPorteur(CpsNumSession, ref Porteur, ref CpsStatusService,ref CpsEtatCarte);
    Pour infos, voici la déclaration de la fonction de la dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("System\\cpsw32.dll", EntryPoint = "#8", CharSet = CharSet.Ansi)]
            public static extern UInt16 CPS_InformationsPorteur(UInt16 NumSession, ref CPS_InfosPorteur InfosPorteur, ref CPS_StatusService StatusService, ref UInt16 EtatCarte);
    A l'exécution, je me prend une Exception AccesViolationException
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    Etant certains des autres paramètres déclarés dans ma fonction, je me dis qu'il doit encore y avoir un souci dans la déclaration de la structure Porteur mais je ne vois pas bien où.
    Si j'enleve le Ref de Porteur, l'exécution passe mais forcément la structure n'est pas initialisée... Que faire ?

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    As-tu déja essayé un truc du style


    public static struct CPS_InfosPorteur
    {
    static public fixed Byte [] CodeCivilite[2]; // [2];
    static public fixed Byte[] NomPatronym[27]; // [27];
    ///
    };

    Pour le tableau a deux dimension je ne sais pas encore comment faire mais a mon avis c'est la bonne piste

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    Etant assez pressé, je me suis tourné vers une approche plus "radicale", en allouant un Byte[] dont la taille est égale à celle du cumul des champs de la stucture passée en param. Puis, à la main, je remplis ma structure avec le contenu du Byte[]...

    Mais je testerai ta solution dans la journée et tiendrai à jour mon résultat.

    Je pense que cela doit venir de mes déclarations vu que le passage d'un Byte[] ne pose pas de pb alors que celui d'un Byte[][] décomposé ne passe pas!

Discussions similaires

  1. violation d'acces BORLNDMM.DLL
    Par nessing dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/07/2007, 22h04
  2. accès à une DLL -> erreur de référence
    Par watcha2020 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 20/02/2007, 18h46
  3. Problème Acces Violation dans une DLL d'envoi de mail
    Par Avisseau dans le forum Delphi
    Réponses: 1
    Dernier message: 25/10/2006, 16h48
  4. Réponses: 1
    Dernier message: 06/10/2006, 10h21
  5. Accés à une dll externe
    Par syrio dans le forum C++
    Réponses: 5
    Dernier message: 07/04/2006, 23h23

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