作者petercoin (彼得幣)
看板C_Sharp
標題[問題] C++ dll傳遞含有char array的struct
時間Fri Jun 5 15:47:18 2015
我手上有一個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://webptt.com/m.aspx?n=bbs/C_Sharp/M.1433490441.A.6ED.html
1F:推 Litfal: 你有在C#裡面定義struct _A並建立unmanaged記憶體再傳嗎? 06/07 04:49
2F:→ petercoin: C#內我有定義struct A了 但是unmanaged的記憶體要怎麼 06/07 20:51
3F:→ petercoin: 宣告 可否幫忙給個關鍵字? 06/07 20:51
4F:推 Litfal: Marshal.StructureToPtr 06/09 16:36
5F:→ Litfal: 另外你給的資訊不夠,重要的C#端如何定義struct你都沒給 06/09 16:37
6F:→ Litfal: 依據定義方式不同,欄位可能需要用MarshalAs的屬性去標記 06/09 16:38
7F:→ Litfal: 還有,你的buf究竟是C++去alloc後傳址給C#、還是C#就alloc 06/09 16:39
8F:→ 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