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)
#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)
另外结构体中要注意对齐问题,你用了byte就会遇到,所以最好改成通用的long类型。
VB提供了一通用对话框控件方便了我们在程序中选择特定文件的需要,不过通用对话框不是内部控件,使用时要从“部件”中向控件工具箱添加,程序发布时需要打包时必然增加“包”的“份量”,感觉十分不便,现用API函数来完成这一任务。
先将如下API函数声明及常量声明粘帖到一个模块中。
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
在窗体上放置文本框和命令按钮各一个,并粘帖如下代码,启动程序按下按钮即会打开选择文件对话框。
Private Sub FileOpen_Click()
Dim ofn As OPENFILENAME
Dim rtn As String
ofn.lStructSize = Len(ofn)
ofn.hwndOwner = Me.hWnd
ofn.hInstance = App.hInstance
ofn.lpstrFilter = "所有文件"
ofn.lpstrFile = Space(254)
ofn.nMaxFile = 255
ofn.lpstrFileTitle = Space(254)
ofn.nMaxFileTitle = 255
ofn.lpstrInitialDir = App.Path
ofn.lpstrTitle = "打开文件"
ofn.flags = 6148
rtn = GetOpenFileName(ofn)
If rtn >= 1 Then
Filename.Text = ofn.lpstrFile
Else
Filename.Text = "Cancel Was Pressed"
End If
End SuPrivate Sub FileOpen_Click()
Dim ofn As OPENFILENAME
Dim rtn As String
ofn.lStructSize = Len(ofn)
ofn.hwndOwner = Me.hWnd
ofn.hInstance = App.hInstance
ofn.lpstrFilter = "所有文件"
ofn.lpstrFile = Space(254)
ofn.nMaxFile = 255
ofn.lpstrFileTitle = Space(254)
ofn.nMaxFileTitle = 255
ofn.lpstrInitialDir = App.Path
ofn.lpstrTitle = "打开文件"
ofn.flags = 6148
rtn = GetOpenFileName(ofn)
If rtn >= 1 Then
Filename.Text = ofn.lpstrFile
Else
Filename.Text = "Cancel Was Pressed"
End If
End Sub
BYTE sSerialNumber[SERIALNO_LEN] 的成员下标为从 0 到 SERIALNO_LEN-1在 VB 中,默认没有指定 Option Base 1 的话:
sSerialNumber(SERIALNO_LEN) As Byte 的成员下标为从 0 到 SERIALNO_LEN知道错在哪里了吧。
VC下的原型:
#define SERIALNO_LEN 47
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);
VC下调用:
lUserID = NET_DVR_Login(csServerIP,m_ServerPort,cUserName, cPassword, &DeviceInfo);
下面是我在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)
问题:我调用时说用户定义类型不可用,帮我看是哪边错了,1、是不是我声明错了,2、是不是我调用写的不对?
其中的lpDeviceInfo你怎么声明的?
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, ByVal lpDeviceInfo As NET_DVR_DEVICEINFO) As Long
调用:
dim lpDeviceInfo as NET_DVR_DEVICEINFO
serid = NET_DVR_Login("192.0.0.64", 8000, "admin", "", lpDeviceInfo)
你看看行不行!不行的话加我MSN!
[email protected]
本人对VB 调用VC的DLL有过部分研究!
纠正一下!
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
说用户定义类型不可用就是这个问题!
我现在也改过来了,但我发现还有问题。
就是VC在调用时有几个参数是用指针(包括IP,用户名,密码)所以我在调用时应该是参数方面有错,我直接写可能不对,大家帮我看看怎么弄,等问题解决了,我再给分啊!
谢谢了,再帮帮忙啊!!!
然后传递的时候 StrPtr(字符串)