Bonjour,
Je suis en train de tester le passage de structure entre une Dll en C++ (unmanaged) et un programme en C#.
Je fais quelque chose de très simple pour le moment.
Ma Dll C++ contient une structure :
Ensuite, dans une fonction je crée et rempli ma Structure de la manière suivante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 typedef struct { int a_; int b_; double c_; bool d_; } TestStruct;
Dans mon code C# j'ai créé une structure du même type afin de récupérer les données avec la fonction Marchal.PtrToStructure.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void* TestEnvoiDonnee() { TestStruct *maStruct = (TestStruct*) malloc(sizeof(TestStruct)); maStruct->a_ = 1; maStruct->b_ = (int)false; maStruct->c_ = 5.2; maStruct->d_ = false; return maStruct; }
Je récupère ensuite ma structure
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public struct MyStruct { public int a_; public int b_; public double c_; public bool d_; }
(Je vous passe le DllImport etc le problème ne vient pas d'ici)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 IntPtr ptr = TestEnvoiDonnee(); if (IntPtr.Zero == ptr) { Console.WriteLine("Probleme de recup du pointeur"); } else { MyStruct donnee = (MyStruct)Marshal.PtrToStructure(ptr, typeof(MyStruct)); }
Et donc le problème c'est que le booleen récupéré dans 'donnee' est toujours à true, je ne sais pas pourquoi. C'est étonnant puisque mon cast de false en int me donne bien 0 lui dans le champ b_.
Les autres valeurs quant à elles sont correctes.
Si quelqu'un à une idée ou une piste, j'avoue que la je trouve ça un peu bizarre ^_^
Merci bien.
Bonne journée
Partager