• Vb.net调用C写的Dll含结构体指针参数的方法


    VC Dll

    #define NAME_LEN_MAX64
    
    typedef struct
    {
      UINT uVendorID;     // 厂商ID
      char acVendorName[NAME_LEN_MAX];     // 厂商名称
      char acProductSeries[NAME_LEN_MAX];     // 产品系列
      char acProductName[NAME_LEN_MAX];     // 产品名称
      char acFriendlyName[NAME_LEN_MAX];     // 昵称,多个同类设备,后加端口号区分
      char acDevFileName[NAME_LEN_MAX];     // 驱动dll名称
      char acFileName[NAME_LEN_MAX];     // 内核驱动逻辑设备名
      char acFirmwareVersion[NAME_LEN_MAX];    // Firmware版本
      char acSensorType[NAME_LEN_MAX];     // sensor类型
      char acPortType[NAME_LEN_MAX];     // 接口类型
    } tDSCameraDevInfo;
    
    CameraGetDevList(tDSCameraDevInfo *pDSCameraList, INT *piNums);

    在Vb.net中使用

    Imports System.Runtime.InteropServices

    <StructLayout(LayoutKind.Sequential)> _ Public Structure tDSCameraDevInfo Dim iVendorID As Integer ' 厂商ID <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim acVendorName() As Byte '厂商名称 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim acProductSeries() As Byte ' 产品系列 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim acProductName() As Byte '产品名称 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim acFriendlyName() As Byte '昵称,多个同类设备,后加端口号区分 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim acDevFileName() As Byte '驱动dll名称 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim acFileName() As Byte '内核驱动逻辑设备名 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim acFirmwareVersion() As Byte 'Firmware版本 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim acSensorType() As Byte 'sensor类型 <MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim acPortType() As Byte End Structure Public Declare Function GetDevList Lib "XXX.dll" (ByRef pDSCameraList As tDSCameraDevInfo, ByRef piNums As Integer) As emDSCameraStatus

    调用时,

    Dim m_asCamDevInfo(50) As tDSCameraDevInfo
    
    Dim m_iNum As Integer
    
    GetDevList(m_asCamDevInfo(0), m_iNum)

    但是这样调用后,结构体中的每个成员都是Byte型的,因此还需要通过下面方法将它转换一下。

    System.Text.UTF8Encoding.UTF8.GetString(m_asCamDevInfo(0).acProductName)

    如此,完成调用。

  • 相关阅读:
    Mybatis <set>标签
    Mybatis <where>标签
    Mybatis choose (when, otherwise)标签
    Mybatis <if>标签
    Mybatis <Sql>标签
    Mybatis配置详解
    [转]在浏览器的标签页显示网站标志图标(或指定图标)的方法
    【转】如何建立一个样式新颖的CSS3搜索框
    【转】css布局居中和CSS内容居中区别和对应DIV CSS代码
    作业:按钮控制打开关闭新窗口及新窗口按钮关闭父窗口
  • 原文地址:https://www.cnblogs.com/youfal/p/2707982.html
Copyright © 2020-2023  润新知