2016-10-01 194 views
1

我目前正在嘗試學習.NET的P/Invoke功能,尤其是在F#中。我試圖調用的C函數需要一個參數,該參數是'指向指針的指針',我正在努力尋找哪個操作符用於在F#中表示這個參數。F指針指針#

做一些閱讀,尤其是這個blog post後,我帶領相信,在.NET語言,這是更好地與代表的&代替*指針參數,使得他們「管理指針」(如果有人能爲我澄清任何使用情況下,我不應該使用管理指針,那麼這將是偉大的!)。 因此,到目前爲止,我試過&&這是不正確的,因爲它代表了一個布爾AND,我也試過**這將匹配指針指針的'C'樣式表示。

我相信在C#中,您可以用類似於'C'風格的方式來表示它,即int** q;

有人會知道如何做類似的F#請嗎?特別是在extern的定義。

謝謝。

更新

道歉不是更具體的 - 這是一個結構類型。

準確地說我在做什麼 - 我試圖複製結構MMAL_BUFFER_HEADER_T找到here爲我正在與樹莓派相機模塊工作的項目。這struct然後用於以下function。指針的地址將在函數返回時設置。

更新2 想大聲這裏 - 將使用System.IntPtr&以正確的方式代表了這一點?

+1

指針指向什麼?如果它是'char **'或'wchar_t **'那麼那些特殊待遇;如果是別的東西,請具體說明。 – ildjarn

+0

謝謝你的回覆 - 我已經更新了帖子。這是一個結構類型。謝謝。 –

+0

這個指針的語義是什麼?該函數是否分配內存並返回一個指向它的指針?或者是別的什麼? –

回答

1

我很努力地檢查這個,但試試這個。

當然你必須確保你獲得了類型和源屬性。 Sequential和Cdecl是否正確?如果你不需要在F#中引用結構體的字段,換句話說就是把它看作是一個不透明的類型,那麼你可能會在函數頭中使用nativeint(有或沒有&符號?),而是相同這樣,你會爲以防萬一別人恰巧遇到了這個問題用void指針C.

open System.Runtime.InteropServices 

type uint32_t = uint32 // likely correct type, but you must check 
type MMAL_STATUS_T = int32 // replace with correct type 
type MMAL_PORT_T = int32 // replace with correct type 

#nowarn "9" 
[<Struct; StructLayout(LayoutKind.Sequential)>] 
type MMAL_BUFFER_HEADER_T = 
    val next: MMAL_BUFFER_HEADER_T ref // will ref work here, or should it be byref<MMAL_BUFFER_HEADER_T>? 
    val priv: nativeint // or you could use a type (with ref?) here also 
    val cmd: uint32_t // assuming uint32_t is uint32 
    // etc 
    val typ: MMAL_BUFFER_HEADER_TYPE_SPECIFIC_T ref 
    val user_data: nativeint // void pointer in C 

[<DllImport("SomeDll.dll", CallingConvention=CallingConvention.Cdecl)>] 
extern MMAL_STATUS_T mmal_port_event_get(MMAL_PORT_T port, MMAL_BUFFER_HEADER_T& buffer, uint32_t event) 
+0

真的很喜歡這個答案@Bent Tranberg,非常感謝你花時間回覆。 –

0

,我已經結束了使用nativeint&來表示函數調用所需的多個間接。該函數本身爲我分配內存,所以我很高興今後繼續使用這種方法。再次感謝所有幫助過我的人。