C#调用c++ dll 封送结构体数组,无法成功 1C

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是乱码?这是为何呢?求大神解释?

5个回答

指针应该列集为IntPtr。
调用的时候需要用Marshal.AllocHGlobal或者Marshal.AllocCoTaskMem之类的函数申请一块固定的内存,把内存地址保存到IntPtr再列集。
当然,谁分配谁释放,就算中间出异常了也不要搞内存泄漏就是。

如果C++代码改了指针目标内存的数据,想把IntPtr指针指向的内存复制成字符串的话,
可以用Marshal.PtrToStringAnsi或者Marshal.PtrToStringUni把字符数据复制到托管堆。

c++中是class,但是其实存储的都是数据,并没有任何成员操作函数,所以在C#中,你可以处理为struct,后面依然是通过marshal中相关structure操作函数
进行操作~ 函数名称具体忘记了,可以查阅下marshal类~

ps:最好能在开发中调试下pt的地址是否有效

为什么我传进去的LX是ptraar【0】的值

  1. 看能否使用结构体来传
  2. 一共四个成员 char* 和string 互转是乱码 那int类型和float类型也是乱码?如果int类型和float传值OK的话 看是否要Convert一下 如果int和float传值也是乱码 ,检查一下是否是有效的指针地址

c++中用char 数组,而不是指针

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐