看板 C_Sharp 關於我們 聯絡資訊
我手上有一個C++寫的dll 現在在C#寫的程式內使用這個dll 在這個dll內有一個struct typedef struct _A { WCHAR buf[64]; DWORD index; } A; 會被當成function的參數傳遞 int funA(A *a) { a.buf...; index = ...; } 現在我想在C#內叫用funA [DllImport("Mydll.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] public static extern int funA(IntPtr a); 有先確認過dll確實有值在buf裡面 但是不管怎樣都沒有辦法得到buf的內容 在猜想會不會是memory沒有正確傳遞? 想請教一下該如何才能正確將dll傳的值抓出來呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.130.36.2 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1433490441.A.6ED.html
Litfal: 你有在C#裡面定義struct _A並建立unmanaged記憶體再傳嗎? 06/07 04:49
petercoin: C#內我有定義struct A了 但是unmanaged的記憶體要怎麼 06/07 20:51
petercoin: 宣告 可否幫忙給個關鍵字? 06/07 20:51
Litfal: Marshal.StructureToPtr 06/09 16:36
Litfal: 另外你給的資訊不夠,重要的C#端如何定義struct你都沒給 06/09 16:37
Litfal: 依據定義方式不同,欄位可能需要用MarshalAs的屬性去標記 06/09 16:38
Litfal: 還有,你的buf究竟是C++去alloc後傳址給C#、還是C#就alloc 06/09 16:39
Litfal: 完成,lib端只負責填滿記憶體,都會影響到寫法 06/09 16:39
Hi Litfal, 不好意思, 因為對C#其實不是很熟悉, 因此沒有給到足夠的資訊。 C#端的struct我找了很多方法去對應WCHAR, 後來是寫成 public struct A { public IntPtr buf; public uint index; } 另外我的buf是在C++端alloc, 然後把取到的資訊填入buf之後回傳給C#, 不知道在這種狀況下該怎麼處理位置的傳遞? 其實目前在這個案例裡, 我是把struct內的資料拆成兩個當作參數傳遞, 但是考量到未來可能需要擴充struct內的資料, 這種方式彈性太小了, 所以還是想要了解如何處理這種問題, 還煩請各位不吝指教, 謝謝各位。 ※ 編輯: petercoin (36.229.39.51), 06/09/2015 23:34:21