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)

解决方案 »

  1.   

    我用不起来,说用户定义类型不可用,VC下定义的结构是指针类型,我在VB中怎么定义啊?怎么调用?
      

  2.   

    可以调用啊。addressof一个结构体变量。
      

  3.   

    GetOpenFileName 这个api就是使用一个结构体作参数的,你看看VB下使用的例子,就知道该如何做了。
    另外结构体中要注意对齐问题,你用了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
      

  4.   

    在 C 中:
    BYTE sSerialNumber[SERIALNO_LEN] 的成员下标为从 0 到 SERIALNO_LEN-1在 VB 中,默认没有指定 Option Base 1 的话:
    sSerialNumber(SERIALNO_LEN) As Byte 的成员下标为从 0 到 SERIALNO_LEN知道错在哪里了吧。
      

  5.   

    把我的问题从说一下:
    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、是不是我调用写的不对?
      

  6.   

    serid = NET_DVR_Login("192.0.0.64", 8000, "admin", "", lpDeviceInfo)
    其中的lpDeviceInfo你怎么声明的?
      

  7.   

    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, 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有过部分研究!
      

  8.   

    搞错了!搞错了!
    纠正一下!
    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
    说用户定义类型不可用就是这个问题!
      

  9.   

    你api直接byref 结构体就是传递指针
      

  10.   

    各位,首先谢谢大家的帮助。你们说的这些方法我以前都有试过。
    我现在也改过来了,但我发现还有问题。
    就是VC在调用时有几个参数是用指针(包括IP,用户名,密码)所以我在调用时应该是参数方面有错,我直接写可能不对,大家帮我看看怎么弄,等问题解决了,我再给分啊!
    谢谢了,再帮帮忙啊!!!
      

  11.   

    实在不行你吧那些字符串指针全部声明为long
    然后传递的时候 StrPtr(字符串)
      

  12.   

    回gisgan2006() :我照你说的写了,出现的问题是serid = NET_DVR_Login("192.0.0.64", 8000, "admin", "", lpDeviceInfo)类型不匹配
      

  13.   

    先想字符串赋值给字符串变量,然后用 StrPtr() 去的字符串的指针,该指针可用用于 API 调用