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++/CLI Discussion :

Problème avec Marshal.PtrToStructure


Sujet :

C++/CLI

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Points : 12
    Points
    12
    Par défaut Problème avec Marshal.PtrToStructure
    Salut,

    Voilà, j'ai le problème suivant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Marshal.PtrToStructure(ptrErr, eContext);
    me soulève une exception de type 'System.AccessViolationException'

    Ci dessous, le code ou l'exception est générée:
    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
    [DllImport(@"madll.dll", EntryPoint = "InitImage", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern IntPtr InitImage(IntPtr ptrRaw, int width, int height, int resolution, int rank, out IntPtr ptrOut);
    static void Main(string[] args)
    {
        Bitmap bmp= new Bitmap(@"Image.bmp");
        byte[] raw = GetBytes(bmp);
     
        IntPtr ptrRaw = Marshal.AllocHGlobal(Marshal.SizeOf(raw[0]) * raw.Length);
        Marshal.Copy(raw, 0, ptrRaw, raw.Length);
        QualityAssessment qa = new QualityAssessment();
        qa.imgData = raw;
        qa.imgHeight = bmp.Height;
        qa.imgWidth = bmp.Width;
        qa.imgResolution = 500;
        qa.fingerRank = 0;
        qa.initok = 123;
        qa.st = QualityAssessment.Type.fingerPrint;
        IntPtr ptrOut = Marshal.AllocHGlobal(Marshal.SizeOf(qa));
        Marshal.StructureToPtr(qa, ptrOut, false);
        ErrorContext eContext = new ErrorContext();
        IntPtr ptrErr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ErrorContext)));
        ptrErr = InitImage(ptrRaw, bmp.Width, bmp.Height, 500, 1, out ptrOut);            
        try
        {
            QualityAssessment2 qa = new QualityAssessment2();
            Marshal.PtrToStructure(ptrOut, qa);
            Console.WriteLine("Finger height : {0}", qa.imgHeight);
            Console.WriteLine("St : {0}", qa.st);
            //Une exception de type System.AccessViolationException est levée
            Marshal.PtrToStructure(ptrErr, eContext);
        }
        catch(Exception e)
        {Console.WriteLine(e.Message);}
    }
    la fonction InitImage renvoie un IntPtr de type ErrorContext et prend une série d'arguments dont un 'out' de type IntPtr.
    J'arrive à récupérer correctement les informations de ptrOut, le parametre out, mais pas ceux de ptrErr.

    Voici la définition des classes ErrorContext et QualityAssessment
    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
    [StructLayout(LayoutKind.Sequential)]
    class ErrorContext
    {        
        [MarshalAs(UnmanagedType.I4)]
        public Returned_Code returnedCode;//en référence à une énumération
        [MarshalAs(UnmanagedType.LPStr, SizeConst = 100)]
        public String errorMessage;
        [MarshalAs(UnmanagedType.LPStr, SizeConst = 256)]
        public String errorFile;
        [MarshalAs(UnmanagedType.U4)]
        public UInt32 errorLine;
    }
    [StructLayout(LayoutKind.Sequential)]
    public class QualityAssessment
    {
        public enum structType { fingerPrint = 111, slap = 222, thumbs = 333 }
        public byte[] imgData = new byte[525420];
        public Int32 imgWidth;
        public Int32 imgHeight;
        public Int32 imgResolution;
        public sbyte fingerRank;
        public Int32 initok;
        public structType st;
    }
    d'avance pour votre aide précieuse

  2. #2
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Evidemment,
    Quelqu'un saurait-il me dire pourquoi une telle exception est levée????

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Voila c'est résolu!!

    Il fallait tout bêtement remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [MarshalAs(UnmanagedType.LPStr, SizeConst = 256)]
    public String errorFile;
    par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
    public String errorFile;

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/05/2011, 17h30
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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