在 上篇文章重点讲解数据类型的转换,在此基础上再讲解函数调用。
1、函数调用
c++中函数
INF_NET_API INF_RESULT WINAPI INF_NET_GetList(long lLoginHandle,DWORD dwInfoContol,BYTE** pBuf,LONG& lBufSize);
C# 中函数
[DllImport(_strCoreSDK)] public static extern int INF_NET_GetList(Int32 lLoginHandle, UInt32 dwInfoContol,IntPtr _Deviceinfoptr, ref Int32 lBufSize);
说明:常见的数值类型,正常转化;指针类型、引用类型直接转化为ref 数值类型。其中byte ** ,这种类型根据在c++中调用,是存储数组的地址,所以在单纯的用ref,不能解决问题。针对此问题,都可以用intptr,关键就是intptr怎么指向,下面重点讲讲如何结构体怎么访问。
在函数调用时为:
iErr = INF_NET_GetList(g_lHandle, 5, (BYTE**)&m_pMonitorInfo, lMonSize);
其中m_pMonitorInfo是结构体数组,所以此函数是获取一系列结构体,针对此,在c#函数中相对应声明为Intptr。
C#中看看如何利用Intptr,传入地址,还有获取数据。
int iDev_size = Marshal.SizeOf(typeof(INFINOVASDK.INF_NET_DEVICE_INFO)); //定义一个存储指针的数组 IntPtr[] _IntptrDevArray = new IntPtr[1]; //初始化指针数组大小 _IntptrDevArray[0] = Marshal.AllocHGlobal(iDev_size * 100);//分配包含100元素的数组 //查询设备指针 IntPtr _IntptrDevInfo = Marshal.AllocHGlobal(iDev_size); //存储设备指针于数组指针 Marshal.Copy(_IntptrDevArray, 0, _IntptrDevInfo, 1);//拷贝指针数组 int buffeesize = 0; int err = INFINOVASDK.INF_NET_GetList(_loginIds[control], 3, _IntptrDevInfo, ref buffeesize); if (err != 0) { return null; } //从指针数组开始获取数据 for (int i = 0; i < 100; i++) { //设定好指针的偏移量 INFINOVASDK.INF_NET_DEVICE_INFO _deviceInfo = (INFINOVASDK.INF_NET_DEVICE_INFO)Marshal.PtrToStructure((IntPtr)((UInt32)_IntptrDevArray[0] + i * iDev_size), typeof(INFINOVASDK.INF_NET_DEVICE_INFO)); if (_deviceInfo.cDevIP != null) { //获取设备的Ip以及MAC bytes_DevIp = _deviceInfo.cDevIP; bytes_Mac = _deviceInfo.cDevMac; break; } } //释放申请的内存空间 Marshal.FreeHGlobal(_IntptrDevInfo); Marshal.FreeHGlobal(_IntptrDevArray[0]);