2013-05-14 72 views
0

我有結構:如何通過數組指針知道指向結構的指針?

public struct MyStruct 
{ 
    public int a; 
    public int b; 
    public byte[] mass; 
} 

我需要: 通行證poiner爲 「質量份」 陣列以C++非託管函數。 完成所有工作後,它會返回指向「質量」的指針。

所以我有MyStruct的列表。我需要知道列表中包含的MyStruct返回的「mass」(指向我的指針)。 如果我知道指向「mass」的指針,我可以減少指向8字節的指針並將指針指向MyStruct?

HOW TO:

1.Get的IntPtr到 「大衆」 陣列?

2.獲取IntPtr到MyStruct結構?

3.從IntPtr獲取MyStruct?

但是,不使用任何複製過程,像Marshal.Copy ...

還是有更好的方法做我需要什麼?我可以像C++或IntPtr一樣使用指針嗎?我該怎麼做?

回答

1

假設爲陣列的存儲器是由託管代碼分配:

當傳遞數組經由P /調用非託管函數,則默認陣列通常在存儲器由被釘扎編組器,以便數組使用的內存不必被複制。

你根本不需要使用IntPtr - 你只需要聲明P/Invoke,以便它接受一個數組參數。

但是,如果非託管代碼正在分配內存以返回到託管代碼,則情況會有所不同;那麼事情就會變得更加困難。

假設情況並非如此,那麼如果你能向我們展示「C」函數聲明,我們可能會想出一個P/Invoke聲明。

(我有,你的情況可能會更復雜,雖然有點感覺......)

一些有用的鏈接給你:

http://msdn.microsoft.com/en-us/library/z6cfh6e6%28v=vs.80%29.aspx

http://msdn.microsoft.com/en-us/library/zah6xy75.aspx

How can I pass a pointer to an array using p/invoke in C#?

以及有關沼澤優化的一些較低級別的信息在調用非託管代碼和傳遞數組時,aller會產生影響。從本質上講,如果能不使數據的副本都:

http://msdn.microsoft.com/en-us/library/23acw07k%28v=vs.80%29.aspx

+0

我需要將數組傳遞給用C++編寫的某些DLL。我可以使用任何聲明。所以你說SomeFunk(byte [] mass)與SomeFunk(IntPtr pMass)相同? – user2377299 2013-05-14 15:36:39

+0

@ user2377299是的,如果你傳遞一個像這樣的字節數組,非託管端可以把它作爲'unsigned char *'。我會在一分鐘內通過一些有用的鏈接更新我的答案。讓我知道是否還有其他需要知道的事情(但我將在接下來的幾個小時內遠離電腦)。 – 2013-05-14 16:36:59

+0

所以。比方說,DLL使用一些func返回字節數組,如Return(byte [] b)。這個字節數組屬於某個父類。我如何確定它,而不是使用foreach模式並比較它們中的所有字節數組?我能以某種方式減少8個字節的指針地址並獲得指向我父類的指針嗎?如果,是的,如何? – user2377299 2013-05-15 08:36:16

0

小心的結構可能會有一些特定的內存對齊。 您可能會感興趣this link

+0

好的。如果我在struct和內存中的所有內容都好的情況下使用[StructLayout(LayoutKind.Sequential,Pack = 1)]。下一步是什麼?我需要一些代碼示例來滿足我的需求。 – user2377299 2013-05-14 15:38:36

+0

@ user2377299對不起,我不太瞭解這個主題。我只記得幾年前面對這樣的問題。 – Marshall777 2013-05-15 13:08:08