在 上篇文章重点讲解数据类型的转换,在此基础上再讲解函数调用。

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]);
View Code

相关文章:

  • 2022-02-01
  • 2022-12-23
  • 2022-12-23
  • 2021-07-22
  • 2022-12-23
  • 2021-09-04
  • 2022-12-23
猜你喜欢
  • 2021-10-20
  • 2021-10-23
  • 2022-12-23
  • 2021-11-12
  • 2022-02-11
相关资源
相似解决方案