Passer une structure à une DLL en C

dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011 - 7 sept. 2010 à 18:11
dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011 - 8 sept. 2010 à 11:58
Salut à tous !

Voilà mon souci, pour le boulot je dispose d'un DLL (conçu en C) que je dois initialisé depuis mon code C#.
Ma structure ressemble à quelque chose comme ça :

public unsafe struct messageQueueInfo_ts
{
    public bool unBooleen;
    public fixed byte unNom[NAME_MAX_SIZE];
    public int level;
    public fixed int ids[MAX_ID_NUMBER];
}


Lorsque j'initialise cette structure (juste avant le passage en paramètre), depuis un bloc unsafe je copie les caractères du nom et les "ids".
Je peux débugguer la DLL pour voir que les champs sont tous à 0. Quand je visualise le pointeur reçu, j'aperçois le nom dans l'était mémoire. Mais quand je veux regarder précisément le tableau de caractère, celui-ci pointe sur une adresse qui correspond à la concaténation de mes caractères.

Quelqu'un aurait-il un indice ? un même un lien correcte pour gérer ce genre de structure complexe ?

Merci de votre attention.

1 réponse

dark_naruto25 Messages postés 127 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 9 mai 2011
8 sept. 2010 à 11:58
Voilà du nouveau. Je tente toujours de passer un tableau de structure à la DLL écrite en C (que je peux débugger, mais pas modifier).
La structure ressemble à ceci :
[StructLayout(LayoutKind.Sequential)]
public struct MaStructure
{
    public bool unBool;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = NAME_MAX_SIZE)]
    public byte[] name;
    public int nbr;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAX_NUMBER)]
    public int[] listID;
}


La fonction de la DLL prendre en paramètre un MaStructure* (pour le tableau).

Le premier souci que j'ai obtenu est qu'il ne peut pas prendre de pointeur sur un type managé. J'ai donc voulu faire du Marshalling pour récupérer des pointeurs non managé :
IntPtr ptrList = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(MaStructure)) * nbrElements);
Marshal.StructureToPtr(mesElements, ptrList, false);


Le second souci arrive enfin ! En débuggant, lorsque j'exécute le StructureToPtr() mon thread est killé et aucune erreur n'apparait.

Quelqu'un aurait-il une idée ?
0
Rejoignez-nous