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

  • 相关阅读:
    [转]cmd-bat批处理命令延时方法
    chrome pyv8下载
    win10锁屏壁纸路径
    MongoDB系列—— Window 搭建Mongodb 集群
    JS判断所有IE浏览器所有版本
    网页中引用优酷视频默认自动播放超清
    SQL 还原或备份失败数据库变成单个用户模式无法访问
    百度webuploader 上传演示例子
    SQL Server 如何更改SQL Server和windows身份方式验证
    已经阻止此发布者在你的计算机上运行软件
  • 原文地址:https://www.cnblogs.com/lihuixian001/p/2939712.html
Copyright © 2011-2022 走看看