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

  • 相关阅读:
    ABP 前端 组件之间传递参数的几种方式
    angular Form 自定义验证
    Docker 启用失败 failed to start docker Application container Engin
    C# 委托与事件
    c# Application.DoEvents()
    c# 泛型
    Ubuntu如何挂载U盘
    jdk1.8 List根据时间字段倒序排序
    yarn安装模块报错:check python checking for Python executable "python2" in the PATH
    yarn : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。
  • 原文地址:https://www.cnblogs.com/lihuixian001/p/2939712.html
Copyright © 2011-2022 走看看