C#调用C、C++结构体数组的方法总结
一个客户要使用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进行调用。两个函数的区别就是如何将内存按定义的数据结构进行解析的区别。
C#调用C、C++结构体数组的方法总结的更多相关文章
- C#调用c++Dll 结构体数组指针的问题
参考文章http://blog.csdn.net/jadeflute/article/details/5684687 但是这里面第一个方案我没有测试成功,第二个方案我感觉有点复杂. 然后自己写啦一个: ...
- C#调用C/C++动态库 封送结构体,结构体数组
一. 结构体的传递 #define JNAAPI extern "C" __declspec(dllexport) // C方式导出函数 typedef struct { int ...
- C#调用C++DLL传递结构体数组的终极解决方案
在项目开发时,要调用C++封装的DLL,普通的类型C#上一般都对应,只要用DllImport传入从DLL中引入函数就可以了.但是当传递的是结构体.结构体数组或者结构体指针的时候,就会发现C#上没有类型 ...
- 绝对好文C#调用C++DLL传递结构体数组的终极解决方案
C#调用C++DLL传递结构体数组的终极解决方案 时间 2013-09-17 18:40:56 CSDN博客相似文章 (0) 原文 http://blog.csdn.net/xxdddail/art ...
- C#调用C/C++动态库 封送结构体,结构体数组
因为实验室图像处理的算法都是在OpenCV下写的,还有就是导航的算法也是用C++写的,然后界面部分要求在C#下写,所以不管是Socket通信,还是调用OpenCV的DLL模块,都设计到了C#和C++数 ...
- C语言 结构体数组保存到二进制文件中
在项目中我定义了一个结构体数组,头文件如下: C/C++ code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...
- NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构
本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...
- C语言 结构体(嵌套结构体--结构体数组)
//结构体--嵌套结构体和结构体数组 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> ...
- C#引用c++DLL结构体数组注意事项(数据发送与接收时)
本文转载自:http://blog.csdn.net/lhs198541/article/details/7593045 最近做的项目,需要在C# 中调用C++ 写的DLL,因为C# 默认的编码方式是 ...
随机推荐
- h5-4 canvas
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 0c-34-自动释放池
#import <Foundation/Foundation.h> #import "Person.h" Person * creatPerson() { Person ...
- js 处理url中文参数 java端接收处理
正常情况下当http请求中带有中文参数时,浏览器会自动对中文进行一次编码(按照当前页面的pageEncoding),java端容器会对接收到的参数自动进行一次转码,则request.getParame ...
- MySQL Spatial Extensions 地理信息
http://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html http://mysqlserverteam.com/mysql-5-7-an ...
- Photoshop-制作图片圆角2种方法[转]
方案一: 使用选区和蒙版相结合,用图章制作圆角选区,删除多余部分 效果: 实现步骤: 一.如果是直接在已有的图片上面编辑则看下图,否则跳过此不 二.用矩形工具选择需要保留的图片内容 三.选 ...
- Linux Shell远程执行命令(命令行与脚本方式)
需求:经常需要在一台服务器远程到其他节点的服务器上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了.介绍两种shell命令远程执行的方法. 方式一: s ...
- [golang学习] goroutine调度
这两天有些闲功夫, 学习下golang, 确实非常简洁. 不过有些缺憾. 在我的测试中. golang的调度(goroutine)似乎不是非常好. func say(k int) { fmt.Prin ...
- WPF 之 自定义窗体标题栏
在WPF中自定义窗体标题栏,首先需要将窗体的WindowStyle属性设置为None,隐藏掉WPF窗体的自带标题栏.然后可以在窗体内部自定义一个标题栏. 例如,标题栏如下: <WrapPanel ...
- python UTC,时间戳,字符串转换
#!/usr/bin/env python #_*_coding:utf-8_*_ # 本地时间 转换 为时间戳 import time import pytz import datetime dat ...
- C#实现插件式架构的方法
插件式架构,一种全新的.开放性的.高扩展性的架构体系.插件式架构设计近年来非常流行,基于插件的设计好处很多,把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现.扩展功能与框架以一种很松的 ...