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 :

Erreur avec Marshal.StructureToPtr


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 102
    Par défaut Erreur avec Marshal.StructureToPtr
    Bonjour,

    J'ai une structure que je dois marshaler :

    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
        public struct T_ACQUISITION2000
        {
            public short sVersion;
            public short sVersionM;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
            public String tcPrestation;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
            public String tcConfiguration;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 9)]
            public String tcMarche;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
            public String tcNom;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 81)]
            public String tcInfo1;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 81)]
            public String tcInfo2;
            public int timeCreation;			// date creation
            public uint uiNumero;				// numero
            public uint uiDuree;				// duree
            public long iArret;					// motif arret      // int
            public double dDeb;
            public double dFin;
            public uint uiNbEchantillon;
            public uint uiSize;
            public short sJournal;
            // meteo
            public short sTemps;
            public float fVent;
            public float fHumidite;
            public float fTemperature;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)]
            public byte[] RFU;
            [MarshalAs(UnmanagedType.Struct)]
            public T_ACQ rAcqTvm;
            public short sCirculation;       //  short
            public short sSens;                  //  short
            [MarshalAs(UnmanagedType.Struct)]
            public T_ACQ rAcqConf;
    }
    Me penchant pour corriger un autre probleme à coté, quand je veux sauvegarder la structure dans un fichier,
    Au moment de convertir la structure en bytearray via ce code :

    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
            public static byte[] StructureToByteArray<T>(object obj)
            {
                if(obj.GetType().Equals(typeof(string)))    
                    return Encoding.ASCII.GetBytes((string)obj);
     
                int len = Marshal.SizeOf(obj);
     
                byte[] arr = new byte[len];
     
                IntPtr ptr = Marshal.AllocHGlobal(len);
     
                Marshal.StructureToPtr(obj, ptr, true); // Exception
     
                Marshal.Copy(ptr, arr, 0, len);
     
                Marshal.FreeHGlobal(ptr);
     
                return arr;
            }
    Quand je passe sur la ligne avec le commentaire, cela m'affiche cette exception :

    Impossible de marshaler le type, car la longueur d'une instance de tableau incorporée ne correspond pas à la longueur déclarée dans la disposition.
    Je n'arrive pas à comprendre d'où vient le probleme.
    Pourriez vous m'aider ?
    Merci.
    Flow.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Formateur
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Formateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Bonjour,

    Peut tu me poster une partie de ton code où tu utilises ta fonction générant l'erreur.

  3. #3
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 102
    Par défaut
    Citation Envoyé par NicoSharp Voir le message
    Bonjour,

    Peut tu me poster une partie de ton code où tu utilises ta fonction générant l'erreur.
    Bonjour,


    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
         public static byte[] StructureToByteArray<T>(object obj)
            {
                if(obj.GetType().Equals(typeof(string)))    
                    return Encoding.ASCII.GetBytes((string)obj);
     
                int len = Marshal.SizeOf(obj);
     
                byte[] arr = new byte[len];
     
                IntPtr ptr = Marshal.AllocHGlobal(len);
     
                Marshal.StructureToPtr(obj, ptr, true); // Exception
     
                Marshal.Copy(ptr, arr, 0, len);
     
                Marshal.FreeHGlobal(ptr);
     
                return arr;
            }

  4. #4
    Membre à l'essai
    Homme Profil pro
    Formateur
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Formateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    On ne sait pas compris, je veux voir le code utilisé pour l'appel à ta fonction pas le corps de la fonction

  5. #5
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Quel est le type d'exception ? Un ArgumentException ? L'objet sur lequel ça plante est de type struct ou de type class ? Est-ce-qu'il pourrait s'agir d'une classe qui n'est pas formatée ? Il y a plusieurs articles de la msdn qui parle du marshaling, entre autres sur les tableaux, il y a peut-être quelque chose à creuser de ce côté là.

  6. #6
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 102
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 102
    Par défaut
    Citation Envoyé par NicoSharp Voir le message
    On ne sait pas compris, je veux voir le code utilisé pour l'appel à ta fonction pas le corps de la fonction
    Ah, pardon !

    La voila :


    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
            public static byte[] StructureArrayToByteArray<T>(object obj)
            {
                T[] array = obj as T[];
     
                int sizeOfElement = Marshal.SizeOf(typeof(T));
     
                byte[] buffer = new byte[sizeOfElement * array.Length];
     
                for(int i = 0; i < array.Length; ++i)
                {
                    T element = array[i];
     
                    byte[] bufbuffer = StructureToByteArray<T>(element);
     
                    Array.Copy(bufbuffer, 0, buffer, i * sizeOfElement, sizeOfElement);
                }
                return buffer;
            }




    Citation Envoyé par Noxen Voir le message
    Quel est le type d'exception ? Un ArgumentException ? L'objet sur lequel ça plante est de type struct ou de type class ? Est-ce-qu'il pourrait s'agir d'une classe qui n'est pas formatée ? Il y a plusieurs articles de la msdn qui parle du marshaling, entre autres sur les tableaux, il y a peut-être quelque chose à creuser de ce côté là.
    Coucou !
    En effet, c'est un ArgumentException exception.
    Je vais voir tes liens.
    Merci.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Formateur
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Formateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Quel est la nature de object obj passé en paramètre de ta fonction

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur Avec Interbase
    Par smokemon dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/10/2004, 07h24
  2. Erreur avec procédure LockWorkStation ...
    Par simonseztech dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 16/08/2004, 15h33
  3. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25

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