2009-08-24 7 views
0

Je rencontre quelques problèmes pour définir une façon de représenter une structure qui contient un pointeur vers un tableau de courts-circuits dans mon code managé. Le struct ressemble à ceci:Marshaling un pointeur vers un tableau de types (C++ managé> C++ non géré)

typedef struct 
{ 
    short size; 
    unsigned short** shortValues; 
} UnmanagedStruct; 

mémoire pour « shortValues » est attribué à l'intérieur du code non managé - donc, même si ce domaine est tout simplement un pointeur sur un tableau de valeurs courtes, a été ajouté un niveau d'indirection supplémentaire pour que La mémoire allouée est également vue par l'appelant (code managé). Le champ 'size' représente le nombre d'éléments dans le tableau. Comment est-ce que je représente ceci dans le code managé?

Je pensais que je le passerais juste dans un IntPtr, alors je ne pouvais pas comprendre comment accéder aux valeurs une fois l'appel non géré revient.

Répondre

0

Le code est-il dangereux?

public unsafe struct UnmanagedStruct 
{ 
    public short size; 
    public ushort** shortValues; 
} 

[DllImport("example.dll")] 
public static extern void GetUnmanagedStruct(out UnmanagedStruct s); 

Si vous avez un pointeur sur un tableau de ushort s:

public static unsafe void WriteValues() 
{ 
    UnmanagedStruct s; 
    GetUnmanagedStruct(out s); 
    for (var i = 0; i < s.size; i++) 
    { 
     ushort x = (*s.shortValues)[i]; 
     Console.WriteLine(x); 
    } 
} 

Si vous avez un tableau de tableaux zéro terminal de ushort s:

public static unsafe void WriteValues() 
{ 
    UnmanagedStruct s; 
    GetUnmanagedStruct(out s); 
    for (var i = 0; i < s.size; i++) 
    { 
     for (ushort* p = s.shortValues[i]; p != null; p++) 
     { 
      ushort x = *p; 
      Console.WriteLine(x); 
     } 
    } 
} 
+0

Ce code me semble tout à fait exact. Merci dtb! Pendant que j'ai votre attention, puis-je poser une autre question? Je l'ai posté dans un autre fil: http://stackoverflow.com/questions/1323797/marshaling-pointer-to-an-array-of-strings – Dilip

+0

BTW: il est préférable de mettre à jour votre question que de poster une réponse à votre question avec de nouveaux détails. Aussi, si une réponse résout votre problème, n'oubliez pas de l'accepter! :) – dtb

+0

@dtb: Je dois être aveugle mais comment accepter une réponse? – Dilip

0

Désolé les gars. J'ai mal compris l'énoncé du problème. Cela ressemble à:

unsigned short ** shortValues;

est un pointeur vers un tableau de pointeur sur des courts-circuits. Ainsi, chaque élément lui-même est un court *

La seule façon que je peux penser à faire est:

public class UnmanagedStruct { taille int public; shortValues ​​IntPtr publiques; }

Après le retour d'appel de code non managé:

IntPtr [] listOfShorts = new IntPtr [size]; Marshal.Copy (shortValues, listOfShorts, 0, taille); Chaque IntPtr dans listOfShorts pointe maintenant sur un court []. Mais maintenant le problème est que je ne connais pas la taille de chaque tableau individuel, ce qui signifie que je ne peux pas les extraire.

Je dois manquer quelque information clé quelque part.

Questions connexes