2009-07-28 33 views

回答

21

你必須手動做到這一點,因爲沒有辦法告訴的P/Invoke層多少數據從C++封送返回值。

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; 
} 

需要注意的是,如果你想從你的C#代碼免費爲innerStructs的內存,您必須使用標準分配器CoTaskMemAlloc在你的C++代碼 - 那麼你可以調用Marshal.CoTaskMemFree釋放innerStructs

+0

很酷的人,非常感謝。另外,作爲一個簡單的問題,是否可以對一個向量進行編組,以便我可以讓OuterStruct擁有一個InnerStructs向量?我知道你不能組織班級,但我認爲也許有人寫了一些棘手的事情來做到這一點。 – DevDevDev 2009-07-28 23:22:50