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#

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

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    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 : 34
    Localisation : France

    Informations professionnelles :
    Activité : Formateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Points : 14
    Points
    14
    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 confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    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 : 34
    Localisation : France

    Informations professionnelles :
    Activité : Formateur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Points : 14
    Points
    14
    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 chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    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 confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    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 : 34
    Localisation : France

    Informations professionnelles :
    Activité : Formateur
    Secteur : Enseignement

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

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

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Hello

    Désolé du retard, j’étais sur d'autres problèmes.

    En faite, la nature de l'objet obj est une structure de type T_ACQUISITION2000.

    On m'a suggéré de faire une copie membre par membre, mais bon, ca fait que ma méthode devient trop rigide et réservé pour un type de structure.
    La seule chose qui varie entre la lecture (via marshalling) et l'ecriture, dans la structure, ce sont les champs de type string.

    Merci.
    .

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

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Bon,

    J'ai résolu mon soucis
    Le probleme venait d'un bout de code où j'allouais un tableau avec la mauvaise valeur.

    Merci à NicoSharp pour son temps passé à m'aider

+ 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