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 :

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;
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
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;
}
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
 
public struct MyStruct
{
    public int    a_;
    public int    b_;
    public double c_;
    public bool   d_;
}
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
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));
}
(Je vous passe le DllImport etc le problème ne vient pas d'ici)

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