我用VB加载一个DLL,在“工程==〉引用”引用这个DLL的时候,显示该DLL不能加载could not be loaded
如果直接运行Private Declare Function RDBPointQuery Lib "C:\WINDOWS\system32\MACSVIDBCom.dll" (ByVal pQueryFlag As PointQueryFlag, ByRef lPNum As Long, ByRef PNameArr() As String_struct, ByVal lDomainNo As Long) As Long
则会报编译出错:'user-defined type not defined',请问是什么原因?

解决方案 »

  1.   

    错误是:用户定义类型未定义。
    dll不能引用,这很正常,表示该DLL有可能是标准的,不通通过引用调用,只能通过Declare声明调用。
    编译出错的原因有可能是类型PointQueryFlag、String_struct没有定义。还有你那些ByVal,ByRef要斟酌一下。
      

  2.   

    PointQueryFlag、String_struct可能需要自己定义一下,你需要查找一下里面包含哪些数据类型,然后类似下面方法定义:
    Public Type PointQueryFlag
            a As Integer
            b As Integer
            rcv_dg_outstanding As Integer
            rcv_any_outstanding As Integer
    End Type
      

  3.   

    用户类型定义的问题解决了,谢谢两位。然后我运行以下代码时
    --------------------------------------
    Private Sub Command1_Click()
    Dim pQueryFlag As pointqueryflag
    Dim lPNum As Long
    Dim PNameArr(10) As String_struct
    Dim PointNam(10) As String_struct
    pQueryFlag.BSDes = ""
    pQueryFlag.BSPTypeName = ""
    pQueryFlag.lQueryFlag = 0
    pQueryFlag.lStationNo = 0
    Dim ret As Long '
    ret = RDBObj.RDBPointQuery(pQueryFlag, lPNum, PNameArr, 0)
    If ret = 0 Then
    For i = 0 To lPNum
     PointName(i).BSString = PNameArr(i).BSString
     Next i
     End If
    End Sub
    --------------------------------------------
    他在ret = RDBObj.RDBPointQuery(pQueryFlag, lPNum, PNameArr, 0)这一行报错
    defined types defined in public object modules can be coerced to or from a variant or passed to late-bound functions .
    我的类型声明是PUBLIC类型的,放在Modules里。是说modules也不是公共模块吗?
      

  4.   

    PointQueryFlag、String_struct这两个类型都是在DLL类型库中的,是不是需要声明一下,而不是自己定义?
      

  5.   

    Private Declare Function RDBPointQuery Lib "C:\WINDOWS\system32\MACSVIDBCom.dll" (ByRef pQueryFlag As PointQueryFlag, ByRef lPNum As Long, ByRef PNameArr() As String_struct, ByVal lDomainNo As Long) As Long自定义类型只能 ByRef
      

  6.   

    是的,必须声明。否则DLL不能识别PointQueryFlag、String_struct。
      

  7.   

    可以问一下如何声明吗?好像在网上都没有找到如何声明DLL里的结构体的内容
      

  8.   

    可以问一下如何声明吗?好像在网上都没有找到如何声明DLL里的结构体的内容
      

  9.   

    VB中,主控台调用另一工程,原用EXE形式调用,现在要改成DLL,那另一工程的FORM,怎样控制主控台MDI为子窗体
      

  10.   

    因为你的dll声明(private)是相当于声明一个类,所以声明自定义类型的时候也需要声明为私有,因为在VB中约定在私有类中不可以声明public的类型使用,所以你将
    public type...改为private type试试
      

  11.   

    大家帮个忙:
    http://topic.csdn.net/u/20100530/18/47a2a0db-6f65-43e9-8930-b63bd16dd82a.html?seed=339997108&r=65833432#r_65833432
      

  12.   

    问题解决了这个DLL是DCS平台的内部文件,引用DLL后,可以直接使用结构体和函数。还是谢谢大家,每人根据贴数给分