C# 调用C结构体

 C++dll函数代码如下:

结构体原形:
typedef struct MY_DATA
{
int DataFlag;
char *DataBuff;
} MY_DATATYPE;

结构体变量声明赋值:
MY_DATATYPE msd;
msd.DataFlag = MY_EMPTY;
msd.DataBuff = (char*)malloc(MYTMPBUFFSIZE*sizeof(char));
ZeroMemory(msd.DataBuff,MYTMPBUFFSIZE*sizeof(char));

导出函数原形:

 MY_DATATYPE SendBuffTo()
  {
  return msd;
  }
首先改C#结构体如下:

public struct MY_DATA
  {
  public int DataFlag;
  public IntPtr Databuff;//注意,我并非将委托的类型改为IntPtr,而将string类结构成员变量改为IntPtr;
  };

委任代码不变:
public delegate MY_DATA SendBuffTo();

调用代码也不变:
SendBuffTo sbt = (SendBuffTo)DllWrap.GetDelegateFromInt(FunSenBuf, typeof(SendBuffTo));

mssd = sbt();//首先将C++的函数返回值读出,mssd是我声明过的C#中MY_DATA结构体变量;
string str = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(mssd.Databuff);//关键语句:将之前定义的IntPtr成员变量 Buff转换下,试过UNICODE,翻出来是问号,ANSI正确;
Console.WriteLine(str);
Console.WriteLine(mssd.DataFlag);//最后经过打印语句检验,值完全收到并解析成功;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值