作者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/cn.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