1、首先在dll声明一个自定义类型
Type pp
     a as string
End Type2、模块中声明一个公共集合且加入PP类型的成员
Public PatternCol As New Collection
dim pp1 as ppPatternCol.add pp13、有个函数定义
Public Sub OpenData(dp As pp)end sub4、调用此方法 call OpenData(PatternCol(1))
时出现错误 “BeRef参数类型不符”,难道PatternCol的成员不是pp类型的吗??????????

解决方案 »

  1.   

    Public Sub OpenData(dp As pp)
    修改为:
    Public Sub OpenData(byval dp As pp)
      

  2.   

    msgbox typename(PatternCol(1))看看呢?另外建议用字典对象。
      

  3.   

    2楼的,Public Sub OpenData(ByVal dp As pp)提示我:“用户定义类型不能用”
      

  4.   

    msgbox typename(PatternCol(1))看看呢?看了 ,是 PP 所以我很纳闷
      

  5.   

    如果这样调用 call OpenData(pp1) 是可以顺利编译的。我就不明白了,难道集合里的成员不是pp类型吗?但msgbox typename(PatternCol(1))弹出的的确是 pp 啊
      

  6.   


    '工程1,调试工程。工程2,active dll工程,先生产工程2.dll,
    '然后工程1引用工程2。不知道你是不是这样
    Dim a As New 工程2Class1'你的类叫做 工程2.Class1
    Dim b As 工程2.pp
    b.a = ""
    a.PatternCol.Add b
    Dim xx As 工程2.pp
    xx = a.PatternCol(1)
    a.OpenData xx为什么非要这么做我也不清楚,反正直接用集合返回是不可以,用个定义好的类型,
    或者是Variant类型变量转一次就可以。其实看下面的代码Dim a As New Class1
    Dim b As 工程2.pp
    b.a = ""
    a.PatternCol.Add bDim c As Long
    c = 2
    a.PatternCol.Add cDim xx As 工程2.ppDim xx2
    xx = a.PatternCol(1)xx2 = a.PatternCol(2) 'xx2=2a.OpenData xx集合不但可以往里面添加pp类型,其他类型也可以,我添了一个long类型。
    看看msdn里面,集合就是集合,没有限制类型,所以他的返回就是不确定的,返回就是Variant类型,要自己转换。
    如果你要做自己的固定类型的集合,需要自己写一个类,在类的接口上做装换。
      

  7.   

    。确实需要转换一下。VB=very SB