2009-08-24 65 views
0

我在表示一個包含指向我的託管代碼中的短褲陣列的結構的方法時遇到了一些麻煩。該結構是這樣的:封裝一個指向類型數組的指針(託管C# - >非託管C++)

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

關於「shortValues」存儲器分配非託管代碼內 - 因此,即使該字段是一個簡單的指針短值的數組中,加入額外的間接電平,使得分配的內存也被調用者(託管代碼)看到。 'size'字段表示數組中元素的數量。我如何在託管代碼中表示這一點?

我想我只通過IntPtr傳遞它,然後我無法弄清楚如何訪問非託管調用返回值。

回答

0

不安全的代碼好嗎?

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

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

如果有一個指針的ushort秒的數組:

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

如果你有ushort小號空終止數組的數組:

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

該代碼看起來完全正確。謝謝dtb!在我引起你的注意的同時,我可以問另外一個問題嗎?我已經發布它在另一個線程: http://stackoverflow.com/questions/1323797/marshaling-pointer-to-an-array-of-strings – Dilip 2009-08-24 17:55:32

+0

順便說一句:最好是更新你的問題,而不是發佈答案給你的問題與新的細節。另外,如果答案解決了您的問題,請不要忘記接受它! :) – dtb 2009-08-24 18:08:04

+0

@dtb:我必須在這裏失明,但我該如何「接受」一個答案? – Dilip 2009-08-24 21:41:15

0

對不起球員。 。我得到了問題說明錯誤。它看起來像:

unsigned short ** shortValues;

是指向短褲指針數組的指針。所以,每一個元素本身是一個短*

唯一我能想到這樣做的方法是:

公共類UnmanagedStruct { 公衆詮釋大小; public IntPtr shortValues; }

從非託管代碼調用返回之後:

IntPtr的[] listOfShorts =新的IntPtr [大小]; Marshal.Copy(shortValues,listOfShorts,0,size);

listOfShorts中的每個IntPtr現在指向一個short []。但現在的問題是我不知道每個數組的大小,這意味着我無法提取它們。我不得不在某處丟失一些關鍵信息。

相關問題