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 结构体就是传递指针