2009-07-28 14 views

Odpowiedz

21

Musisz to zrobić ręcznie, ponieważ nie ma sposobu, aby powiedzieć P/Invoke warstwę ile danych do Marszałka z C++ zwraca wartość.

struct OuterStruct { 
    int numberStructs; 
    IntPtr innerStructs; 
}; 

OuterStruct s = getStructs(); // using DllImport 
var structSize = Marshal.SizeOf(typeof(InnerStruct)); 
var innerStructs = new List<InnerStruct>(); 
var ptr = s.innerStructs; 

for (int i = 0; i < s.numberStructs; i++) 
{ 
    innerStructs.Add((InnerStruct)Marshal.PtrToStructure(ptr, 
     typeof(InnerStruct)); 
    ptr = ptr + structSize; 
} 

Pamiętaj, że jeśli chcesz, aby zwolnić pamięć dla innerStructs z kodu C#, trzeba użyć standardowego przydzielania CoTaskMemAlloc w kodzie C++ - wtedy można nazwać Marshal.CoTaskMemFree uwolnić innerStructs.

+0

Fajny człowiek, wielkie dzięki. Ponadto, jako szybkie pytanie, czy możliwe jest Marshalowanie wektora, tak żebym mógł mieć OuterStructa mieć wektor InnerStructs? Wiem, że nie możesz poprowadzić zajęć, ale pomyślałem, że może ktoś napisał coś trudnego do zrobienia. – DevDevDev

+0

Nie o tym wiem, ale nigdy nie patrzyłem. :-) –

+0

Rzucasz wskaźnik na 'int'? Co jeśli działa w 64-bitowym procesie ?! [Nie potrzebujesz rzutów] (https://msdn.microsoft.com/en-us/library/system.intptr.op_addition (v = vs.110) .aspx) – doug65536

Powiązane problemy