问题描述
- C#调用c++ dll 封送结构体数组,无法成功
-
c++代码:
class qf
{
private:
char *id;
char *mc;float sd;
int LX;
};
函数:int EntryPoint(qf *qfw);c#代码:
public class qf
{
private string id;
private string mc;
private float sd;
private int LX;
};
c#调用:
qf[] qfw = new qf[2];
for (int i = 0; i < qfw.Length; i++)
{
qfw[i] = new qf(t, t, (float)0.5, 1);
}IntPtr[] ptrarr = new IntPtr[1]; ptrarr[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(qf)) * 2); //分配包含两个元素的数组 IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(qf))); Marshal.Copy(ptrarr, 0, pt, 1); //拷贝指针数组 dll.EntryPoint( pt); 可以进入c++,但是传进去的pt是乱码?这是为何呢?求大神解释?
解决方案
指针应该列集为IntPtr。
调用的时候需要用Marshal.AllocHGlobal或者Marshal.AllocCoTaskMem之类的函数申请一块固定的内存,把内存地址保存到IntPtr再列集。
当然,谁分配谁释放,就算中间出异常了也不要搞内存泄漏就是。
如果C++代码改了指针目标内存的数据,想把IntPtr指针指向的内存复制成字符串的话,
可以用Marshal.PtrToStringAnsi或者Marshal.PtrToStringUni把字符数据复制到托管堆。
解决方案二:
c++中是class,但是其实存储的都是数据,并没有任何成员操作函数,所以在C#中,你可以处理为struct,后面依然是通过marshal中相关structure操作函数
进行操作~ 函数名称具体忘记了,可以查阅下marshal类~
ps:最好能在开发中调试下pt的地址是否有效
解决方案三:
为什么我传进去的LX是ptraar【0】的值
解决方案四:
自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶
解决方案五:
自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶自己顶~顶啊顶
解决方案六:
- 看能否使用结构体来传
- 一共四个成员 char* 和string 互转是乱码 那int类型和float类型也是乱码?如果int类型和float传值OK的话 看是否要Convert一下
如果int和float传值也是乱码 ,检查一下是否是有效的指针地址
解决方案七:
c++中用char 数组,而不是指针