Comment puis-je marshall un pointeur vers un pointeur d'un tableau de structures?

Mon C déclarations sont comme suit:

int myData(uint myHandle, tchar *dataName, long *Time, uint *maxData, DATASTRUCT **data);

typedef struct {
  byte Rel;
  __int64 Time;
  char Validated;
  unsigned char Data[1];
} DATASTRUCT ;

Mon C# déclarations sont comme suit:

[DllImport("myData.dll", EntryPoint = "myData")]
public static extern int myData(uint myHandle, [MarshalAs(UnmanagedType.LPTStr)] string dataName, out long Time, out uint maxData, ref DATASTRUCT[] data);

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DATASTRUCT
{
    public sbyte Rel;
    public long Time;
    public byte Validated;
    public double Data;
}

Je puis appeler la fonction managée comme suit:

string dataToShow = "description";
long Time;
uint maxData; //How many structs will be returned, i.e. how much data is available
uint myHandle = 1;

DATASTRUCT[] dataInformation = new DATASTRUCT[3]; //doesn't matter what I specify as the array size?

myData(myHandle, dataToShow, out Time, out maxData, ref dataInformation);

Lors de l'exécution de la fonction ci-dessus sera de retour avec succès avec seulement une structure, même si il ya 3 pour revenir. Pourquoi est-ce donc?

Des informations supplémentaires; j'ai essayé de passer le pointeur vers un pointeur d'un tableau de struct l'une des manières suivantes:

- ref DATASTRUCT[] data; //Works but only returns one struct
- [Out, MarshalAs(UnmanagedType.LPArray)] DATASTRUCT[] data; //returns the number of defined structs with garbage

Si je comprends bien j'ai peut-être besoin de faire de manuel de triage à l'aide de IntPtr, je ne sais pas comment implémenter cela, cependant, donc, tous les conseils seront les bienvenues.

Quelle est la fonction C l'allocation de leurs structures? Faut-il utiliser le tableau d'entrée comme un tampon, ou de générer de nouvelles structures avec malloc?
Oh, et aussi, vous êtes en C# déclaration des regards mauvais. Un unsigned char n'est pas de la même taille que d'un lit double (1 vs 8 octets)
Malheureusement, la bibliothèque DLL de la documentation ne précise pas si il alloue de la mémoire pour la structure ou pas. Je suis en supposant qu'elle ne l'est pas. Je ne vous donnent pas la pleine décélération pour Data c'est en fait une variable char qui peut prendre un maximum de 8 octets et c'est la raison derrière le marshaling comme un double, cette variable certainement renvoie des résultats corrects à chaque fois que je l'ai testé.
Essayez cette [, MarshalAs(UnmanagedType.LPArray,SizeParamIndex:=3)] DATASTRUCT[] data;
J'obtiens une exception lors de l'appel de ce que myData(myHandle, dataToShow, out Time, out maxData, out dataInformation); retrait de la out retourne un résultat similaire comme [Out, MarshalAs(UnmanagedType.LPArray)] DATASTRUCT[] data;

OriginalL'auteur user1470994 | 2012-06-21