一个客户要使用C#调用我们用C++开发的一个动态链接库,本来我没有C#的开发经验,就随便写了一个例程。以为很简单就可以搞定,没想到客户开发的过程中遇到了不少问题,最困难的就是用C#调用C++接口中的自定义数据类型的数组作为参数的情况了,解决完问题,总结如下。

DLL接口定义如下:

这里pDinCanInfo是有3个DINCAN_INFO元素数组的指针,其中ReadDinCanInfo中的pDinCanInfo需要作为out参数,WriteDinCanInfo需要作为In参数,这两种使用形式在C#中的调用方法也不太一样。

C#调用ReadDinCanInfo关键代码如下:

DINCAN_INFO DinInfo = new DINCAN_INFO();

int size = Marshal.SizeOf(typeof(DINCAN_INFO)) * 3;

byte[] bytes = new byte[size];

IntPtr pBuff = Marshal.AllocHGlobal(size);

DINCAN_INFO[] pDInfo = new DINCAN_INFO[3];

if (ReadDinCanInfo(1811422176, pBuff)) //参数一为卡内码

{

for (int i = 0; i < 3; ++i)

{

IntPtr pPonitor = new IntPtr(pBuff.ToInt64() + Marshal.SizeOf(typeof(DINCAN_INFO)) * i);

pDInfo[i] = (DINCAN_INFO)Marshal.PtrToStructure(pPonitor, typeof(DINCAN_INFO));

MessageBox.Show("订餐日期:" + pDInfo[i].iYear + "-"+ pDInfo[i].iMonth + "-"+ pDInfo[i].iDay);

MessageBox.Show("订餐餐次:" + pDInfo[i].iMeal);

MessageBox.Show("是否取餐:" + pDInfo[i].bTaked);

}

Marshal.FreeHGlobal(pBuff);

MessageBox.Show("读取订餐信息成功");

}

C#调用WriteDinCanInfo关键代码如下:

DINCAN_INFO DinInfo = new DINCAN_INFO();

DinInfo.iYear =Convert.ToUInt32( DateTime.Now.Year);

DinInfo.iMonth = Convert.ToUInt32( DateTime.Now.Month);

DinInfo.iDay = Convert.ToUInt32( DateTime.Now.Day);

DinInfo.iType = 1;

DinInfo.iMeal = 1;

DinInfo.bTaked = false;

int size = Marshal.SizeOf(typeof(DINCAN_INFO)) * 3;

byte[] bytes = new byte[size];

IntPtr pBuff = Marshal.AllocHGlobal(size);

DINCAN_INFO[] pDInfo = new DINCAN_INFO[3];

long ptr = pBuff.ToInt64();

for (int i = 0; i < 3; ++i )

{

IntPtr RPtr = new IntPtr(ptr);

pDInfo[i] = new DINCAN_INFO();

pDInfo[i].iYear = Convert.ToUInt32(DateTime.Now.Year);

pDInfo[i].iMonth = Convert.ToUInt32(DateTime.Now.Month);

pDInfo[i].iDay = Convert.ToUInt32(DateTime.Now.Day);

pDInfo[i].iType = Convert.ToUInt32(i);

pDInfo[i].iMeal = Convert.ToUInt32(i);

pDInfo[i].bTaked = false;

Marshal.StructureToPtr(pDInfo[i], RPtr, false);

ptr += Marshal.SizeOf(typeof(DINCAN_INFO));

}

if (WriteDinCanInfo(1811422176, pBuff)) // 参数一为卡内码

{

MessageBox.Show("写入订餐信息成功");

}

代码看起来比较麻烦,要参考的抄以上代码了,主要思想就是申请一块内存,在申请的这块内存中构建数组对象,然后将这个内存地址作为pDinCanInfo进行调用。两个函数的区别就是如何将内存按定义的数据结构进行解析的区别。

最新文章

  1. Referenced file contains errors (http://www.springframework.org/schema/context). For more information, right click on the message in the Problems
  2. oracle xmltype导入并解析Excel数据 (一)创建表与序
  3. CentOS上yum安装JDK
  4. js的基本的一些方法
  5. ORACLE 日期比较
  6. [HDOJ1171]Big Event in HDU(01背包)
  7. nodejs学习:sails框架的学习
  8. paip.mysql备份慢的解决
  9. OSAL多任务资源分配机制
  10. [rxjs] Creating An Observable with RxJS
  11. asp.net命名规范
  12. sizeof,一个其貌不扬的家伙(转)
  13. sqlserver 操作xml
  14. php设计模式八-----装饰器模式
  15. ubuntu 14.04 安装 rabbitmq
  16. win10应用商店打不开,错误代码0x80131500
  17. ArcGIS工具备忘
  18. 【Log】logback的配置和使用(一)
  19. Ubuntu16.04安装json-c
  20. microsoft cl.exe 编译器

热门文章

  1. 经典排序算法总结与实现 ---python
  2. Docker 1.12.0将要发布的新功能
  3. 关于在线查看相关开源源码的网站,包括Android源码
  4. 修改FFMpeg源码—捕获丢包
  5. 【¥200代金券、iPad等您来拿】 阿里云9大产品免费公测#10月9日-11月6日#
  6. C#读取Word模板替换相应的字符串(标签)生成新的Word
  7. MS SQL SERVER 中的系统表
  8. HDU 1257 最少拦截系统 (DP || 贪心)
  9. php实现二路归并排序
  10. 第四节 数据格式化和ModelAttribute注解的介绍