首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB调用VC编的DLL有关问题(参数为结构体)

2012-02-26 
VB调用VC编的DLL问题(参数为结构体)VC下的原型:#defineSERIALNO_LEN48typedefstruct{BYTEsSerialNumber[SE

VB调用VC编的DLL问题(参数为结构体)
VC下的原型:
#define   SERIALNO_LEN   48
typedef   struct     {
BYTE   sSerialNumber[SERIALNO_LEN];     //序列号
BYTE   byAlarmInPortNum;//DVR报警输入个数
BYTE   byAlarmOutPortNum;//DVR报警输出个数
BYTE   byDiskNum;//DVR   硬盘个数
BYTE   byDVRType;//DVR类型,  
BYTE   byChanNum;//DVR   通道个数
BYTE   byStartChan;//起始通道号,例如DVS-1,DVR   -   1
}NET_DVR_DEVICEINFO,   *LPNET_DVR_DEVICEINFO;
NET_DVR_API   LONG   __stdcall   NET_DVR_Login(char   *sDVRIP,WORD   wDVRPort,char   *sUserName,char   *sPassword,LPNET_DVR_DEVICEINFO   lpDeviceInfo);
下面是我在VB下的声明:
Const   SERIALNO_LEN   =   48
  Private   Type   NET_DVR_DEVICEINFO
    sSerialNumber(SERIALNO_LEN)   As   Byte       '//序列号
      byAlarmInPortNum   As   Byte             '//DVR报警输入个数
      byAlarmOutPortNum   As   Byte             '//DVR报警输出个数
      byDiskNum   As   Byte                             '//DVR   硬盘个数
      byDVRType   As   Byte                             '//DVR类型,
      byChanNum   As   Byte                           '//DVR   通道个数
      byStartChan   As   Byte                         '//起始通道号,例如DVS-1,DVR   -   1
End   Type
Private   Declare   Function   NET_DVR_Login   Lib   "D:\Dll\hcnetsdk.dll "   (ByRef   sDVRIP   As   Byte,   ByVal   wDVRPort   As   Long,   ByRef   sUserName   As   Byte,   ByRef   sPassword   As   Byte,   ByVal   lpDeviceInfo   As   NET_DVR_DEVICEINFO)   As   Long
调用:
serid   =   NET_DVR_Login( "192.0.0.64 ",   8000,   "admin ",   " ",   lpDeviceInfo)

[解决办法]
在 C 中:
BYTE sSerialNumber[SERIALNO_LEN] 的成员下标为从 0 到 SERIALNO_LEN-1

在 VB 中,默认没有指定 Option Base 1 的话:
sSerialNumber(SERIALNO_LEN) As Byte 的成员下标为从 0 到 SERIALNO_LEN

知道错在哪里了吧。

[解决办法]
搞错了!搞错了!
纠正一下!
Const SERIALNO_LEN = 48
private Type NET_DVR_DEVICEINFO
sSerialNumber(SERIALNO_LEN-1) As Byte '//序列号//VB是从0开始
byAlarmInPortNum As Byte '//DVR报警输入个数
byAlarmOutPortNum As Byte '//DVR报警输出个数
byDiskNum As Byte '//DVR 硬盘个数
byDVRType As Byte '//DVR类型,
byChanNum As Byte '//DVR 通道个数
byStartChan As Byte '//起始通道号,例如DVS-1,DVR - 1
End Type
Private Declare Function NET_DVR_Login Lib "D:\Dll\hcnetsdk.dll " (byval sDVRIP As string, ByVal wDVRPort As Long, byval sUserName As string, byval sPassword As string, lpDeviceInfo As NET_DVR_DEVICEINFO) As Long ' ' ' '结构体只能用BYREF!不能byval
调用:
dim lpDeviceInfo as NET_DVR_DEVICEINFO
serid = NET_DVR_Login( "192.0.0.64 ", 8000, "admin ", " ", lpDeviceInfo)


结构体只能用BYREF!不能byval
说用户定义类型不可用就是这个问题!
[解决办法]
你api直接byref 结构体就是传递指针

热点排行