C#封装API结构数组指针实例
来源:互联网 发布:二小姐脸型数据 南风 编辑:程序博客网 时间:2024/06/05 22:31
int len = 0;
VCI_ERR_INFO errInfo = new VCI_ERR_INFO();
errInfo.Passive_ErrData = new byte[3];
VCI_CAN_OBJ[] frameInfos=new VCI_CAN_OBJ[200];
VCI_CAN_OBJ vData = new VCI_CAN_OBJ();
vData.Reserved = new byte[3];
vData.Data = new byte[8];
IntPtr tempPtr;
try
{
while (mConnResult)
{
//从非托管代码中分配内存
tempPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(System.Runtime.InteropServices.Marshal.SizeOf(vData) * 200);
if (tempPtr != null)
{
//将数据从托管代码中封送到非托管代码内存快
System.Runtime.InteropServices.Marshal.StructureToPtr((object)vData, tempPtr, true);//System.Runtime.InteropServices.Marshal.AllocHGlobal(24);//50 *
}
Thread.Sleep(1);
if (!mConnResult)
break;
try
{
//flag++;
len = (int)APICodeFunction.VCI_Receive((UInt32)mConfigData.CanCardType, (UInt32)mConfigData.DevIndex,
(UInt32)mConfigData.CanIndex, tempPtr, 200, 200);//50 * 24 ref
}
catch (ExecutionEngineException ee)
{
Trace.WriteLine(string.Format("接收数据:{0}", ee.Message), TraceLevel.Error.ToString());
}
if (len <= 0)
{
//注意:如果没有读到数据则必须调用此函数来读取出当前的错误码,
//千万不能省略这一步(即使你可能不想知道错误码是什么)
APICodeFunction.VCI_ReadErrInfo((uint)mConfigData.CanCardType, (UInt32)mConfigData.DevIndex, (UInt32)mConfigData.CanIndex, ref tempPtr);
}
else
{
byte[] frameInfosBuffer = new byte[len * 24];
//将数据从非托管内存块奉送到指定类型的托管对象
object vTestObj = System.Runtime.InteropServices.Marshal.PtrToStructure(tempPtr, typeof(VCI_CAN_OBJ));
VCI_CAN_OBJ vTempCan = (VCI_CAN_OBJ)vTestObj;
//byte[] data = vTempCan.Data;
//byte dataLength = vTempCan.DataLen;
//Debug.WriteLine(BitConverter.ToString(vTempCan.Data, 0).Replace("-", " "));
for (int i = 0; i < len; i++)
{
IntPtr pPonitor = new IntPtr(tempPtr.ToInt64() + System.Runtime.InteropServices.Marshal.SizeOf(typeof(VCI_CAN_OBJ)) * i);
frameInfos[i] = (VCI_CAN_OBJ)System.Runtime.InteropServices.Marshal.PtrToStructure(pPonitor, typeof(VCI_CAN_OBJ));
frameInfos[i].ID = frameInfos[i].ID * 8;
}
//vTempCan.ID = vTempCan.ID * 8;
//frameInfos[0] = vTempCan;
OnReceivedEventHander(len, frameInfos);
}
System.Runtime.InteropServices.Marshal.FreeHGlobal(tempPtr);
}
}
VCI_ERR_INFO errInfo = new VCI_ERR_INFO();
errInfo.Passive_ErrData = new byte[3];
VCI_CAN_OBJ[] frameInfos=new VCI_CAN_OBJ[200];
VCI_CAN_OBJ vData = new VCI_CAN_OBJ();
vData.Reserved = new byte[3];
vData.Data = new byte[8];
IntPtr tempPtr;
try
{
while (mConnResult)
{
//从非托管代码中分配内存
tempPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(System.Runtime.InteropServices.Marshal.SizeOf(vData) * 200);
if (tempPtr != null)
{
//将数据从托管代码中封送到非托管代码内存快
System.Runtime.InteropServices.Marshal.StructureToPtr((object)vData, tempPtr, true);//System.Runtime.InteropServices.Marshal.AllocHGlobal(24);//50 *
}
Thread.Sleep(1);
if (!mConnResult)
break;
try
{
//flag++;
len = (int)APICodeFunction.VCI_Receive((UInt32)mConfigData.CanCardType, (UInt32)mConfigData.DevIndex,
(UInt32)mConfigData.CanIndex, tempPtr, 200, 200);//50 * 24 ref
}
catch (ExecutionEngineException ee)
{
Trace.WriteLine(string.Format("接收数据:{0}", ee.Message), TraceLevel.Error.ToString());
}
if (len <= 0)
{
//注意:如果没有读到数据则必须调用此函数来读取出当前的错误码,
//千万不能省略这一步(即使你可能不想知道错误码是什么)
APICodeFunction.VCI_ReadErrInfo((uint)mConfigData.CanCardType, (UInt32)mConfigData.DevIndex, (UInt32)mConfigData.CanIndex, ref tempPtr);
}
else
{
byte[] frameInfosBuffer = new byte[len * 24];
//将数据从非托管内存块奉送到指定类型的托管对象
object vTestObj = System.Runtime.InteropServices.Marshal.PtrToStructure(tempPtr, typeof(VCI_CAN_OBJ));
VCI_CAN_OBJ vTempCan = (VCI_CAN_OBJ)vTestObj;
//byte[] data = vTempCan.Data;
//byte dataLength = vTempCan.DataLen;
//Debug.WriteLine(BitConverter.ToString(vTempCan.Data, 0).Replace("-", " "));
for (int i = 0; i < len; i++)
{
IntPtr pPonitor = new IntPtr(tempPtr.ToInt64() + System.Runtime.InteropServices.Marshal.SizeOf(typeof(VCI_CAN_OBJ)) * i);
frameInfos[i] = (VCI_CAN_OBJ)System.Runtime.InteropServices.Marshal.PtrToStructure(pPonitor, typeof(VCI_CAN_OBJ));
frameInfos[i].ID = frameInfos[i].ID * 8;
}
//vTempCan.ID = vTempCan.ID * 8;
//frameInfos[0] = vTempCan;
OnReceivedEventHander(len, frameInfos);
}
System.Runtime.InteropServices.Marshal.FreeHGlobal(tempPtr);
}
}
- C#封装API结构数组指针实例
- Atitit. C# java 的api 目录封装结构映射总结
- 数组、结构、指针混用实例及疑难解决过程
- C# API 封装类
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- c# 调用 c++ dll 参数为结构体数组指针
- C#调用c++Dll结构体数组指针的问题
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 .
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 指针,数组和结构
- 结构体数组指针
- 结构指针和数组
- google map自定义图层(带闪动和发光效果)
- Java 多线程与并发编程专题
- C++中get()和getline()的使用区别
- 在jsp中过滤器的用法(简单解决中文乱码问题)
- beagleboard-xm 移植android2.3
- C#封装API结构数组指针实例
- wget常用命令
- 两个数相乘,小数点后位数没有限制,请写一个高精度算法
- android中的通信机制总结
- ubuntu和ubuntu下xp 共享文件
- 简单操作拥有Win7/XP双系统
- CSS选择符
- Java虚拟机(一)--java程序是如何被运行的
- 去掉点击链接时的虚线框