zoukankan      html  css  js  c++  java
  • C# 调用C++DLL传递指向指针的指针参数的方法

    C++结构体定义:

    struct DeviceInfo
    {    
        char szDeviceName[DEVICE_NAME_LEN];
        char szMACAddress[MAC_ADDRESS_LEN];        
        char szDeviceIP[DEVICE_IP_LEN];
    };

    C#结构体的定义:

        [StructLayout(LayoutKind.Sequential)]
       public struct DeviceInfo
        {
              [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
            public string szDeviceName;
    
             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
              public string szMACAddress;
    
             [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 17)]
             public string szDeviceIP; 
    
    
        }

    情况1:C++的dll负责分配内存

    C++导出函数的声明

    #define DLL_API  extern "C"  __declspec(dllexport)
    DLL_API int findAllDevices(DeviceInfo** ppDeviceInfoList,int * pCount);

    C#导入函数的声明

    [DllImport("IPAlter_d.dll")]
            public extern static int findAllDevices(out IntPtr pDeviceInfo, ref int pCount);

    C#的调用方法:

     IntPtr pBuff = new IntPtr();//直接new一个参数即可
    
    
    
                if (IPAlter.findAllDevices(out pBuff, ref cout) != 1)
                {
                    System.Console.WriteLine("搜索失败!");
                    System.Console.ReadLine();
                    return;
                }
    
              
                for (int i = 0; i < cout; i++)
                {
    
                    IntPtr pPonitor = new IntPtr(pBuff.ToInt64() + Marshal.SizeOf(typeof(DeviceInfo)) * i);
                  
    
                  System.Console.WriteLine(((DeviceInfo)Marshal.PtrToStructure(pPonitor, typeof(DeviceInfo))).szDeviceName);
                    System.Console.WriteLine(((DeviceInfo)Marshal.PtrToStructure(pPonitor, typeof(DeviceInfo))).szDeviceIP);
                    System.Console.WriteLine(((DeviceInfo)Marshal.PtrToStructure(pPonitor, typeof(DeviceInfo))).szMACAddress);
                }

    情况2:C#负责分配内存

    C++导出函数的声明:

    DLL_API int findAllDevice(DeviceInfo* ppDeviceInfoList,int * pCount);

     C#导入函数的声明:

     [DllImport("IPAlter_d.dll")]
            public extern static int findAllDevice(IntPtr pDeviceInfo, ref int pCount);

     C#的调用方法:

                DeviceInfo[] DeviceInfoList = new DeviceInfo[50];
                int size = Marshal.SizeOf(typeof(DeviceInfo)) * 50;
                byte[] bytes = new byte[size];
                IntPtr pBuff = Marshal.AllocHGlobal(size);
    
    
    
                if (IPAlter.findAllDevice(pBuff, ref cout) != 1)
                {
                    System.Console.WriteLine("搜索失败!");
                    System.Console.ReadLine();
                    return;
                }
    
    
                for (int i = 0; i < cout; i++)
                {
    
                    IntPtr pPonitor = new IntPtr(pBuff.ToInt64() + Marshal.SizeOf(typeof(DeviceInfo)) * i);
                    DeviceInfoList[i] = (DeviceInfo)Marshal.PtrToStructure(pPonitor, typeof(DeviceInfo));
    
                    System.Console.WriteLine(DeviceInfoList[i].szDeviceName);
                    System.Console.WriteLine(DeviceInfoList[i].szDeviceIP);
                    System.Console.WriteLine(DeviceInfoList[i].szMACAddress);
                }
                Marshal.FreeHGlobal(pBuff);

    可以参考:

    http://www.cnblogs.com/cxwx/archive/2010/12/29/1921140.html

    http://hi.baidu.com/fanr520/item/e761f9ca0766d462f6c95d55

    http://blog.csdn.net/wangweitingaabbcc/article/details/7663949

  • 相关阅读:
    高德地图js开发,给城市某个区添加颜色
    threejs 实现易拉罐换肤功能
    React 跨页面保留前一页状态的一种实现方法
    nginx 解决客户端跟服务跨域问题
    React图片预览组件,支持缩放、旋转、上一张下一张功能
    h5 高德地图开发 谷歌浏览器定位失败解决方案
    echarts点击省份显示对应的省份
    sec:authorize 标签 通过不通过权限例子
    择左边多选框的值移动到右边多选框
    更改css element.style
  • 原文地址:https://www.cnblogs.com/lihuixian001/p/2939712.html
Copyright © 2011-2022 走看看