'研究了一下,至少你的问题不用什么VarPtrArray
'     下面的程序已经调试通过'在Form里
Option ExplicitPrivate xyz(2) As MyUDT
Dim clsTest As New clsTestPrivate Sub Command1_Click()
With xyz(0)
.Param1 = 12
.Param2 = "Sonicdater"
.Param3 = "http://www.163.org/"
.Param4 = 1312
.Param5 = 18
End With
'加上一个数组个数参数,因为传得是明确的指针,失去了
'   原数组大小信息。这和C里传数组指针,需要传大小是
'   一样的。大多数时候不用传SafeArray指针
clsTest.mEntryPoint VarPtr(xyz(0)), 1
End Sub'在Module里
Option Explicit
'变通一下,用不着什么VarPtrArray'错了,VarPtrStringArray必须得写类型库,这样才能避免A2U的转换
'Declare Function VarPtrStringArray Lib "msvbvm60.dll" Alias "VarPtr" _
'  (Var() As Any) As Long
'要用也应该是
'Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" _
'  (Var() As Any) As LongPublic Type MyUDT
Param1 As Integer
Param2 As String * 45
Param3 As String * 45
Param4 As Long
Param5 As Long
End Type'在clsTest.cls里
Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" _
(pDst As Any, _
pSrc As Any, _
ByVal ByteLen As Long)'第二个参数是数组个数
Public Sub mEntryPoint(ptrType As Long, num As Long)
Dim abc() As MyUDT
ReDim abc(0 To num) As MyUDT
Dim T(1 To 5)Dim i As Long
For i = 0 To num - 1
    CopyMemory ByVal VarPtr(abc(i)), ByVal ptrType, ByVal LenB(abc(0))
NextWith abc(0)
T(1) = .Param1
T(2) = .Param2
T(3) = .Param3
T(4) = .Param4
T(5) = .Param5
End WithDebug.Print CStr(T(3))
End Sub'结果字串正常输出。

解决方案 »

  1.   

    CopyMemory ByVal abc, ByVal ptrType, ByVal LenB(abc)中的第一个参数
    byval abc是你目的地址,必须用自定义数组的第一个成员明确声明,
    并且目的地址的长度应明确并且足够厂,如果不知道确切长度,可以用ubound
    提前得到。否则极易出现地址越界。
    另外,Option Explicit 
    Declare Function VarPtrStringArray Lib "msvbvm60.dll" Alias "VarPtr" _ 
    (Var() As Any) As Long 并没有被你声明称类clsTest的一个方法,你怎么可以直接调用clsTest.mEntryPoint VarPtrStringArray(xyz)
      

  2.   

    Private xyz(2) As MyUDT 
    Dim clsTest As New clsTest 
    另外,Private xyz(2) As MyUDT 
    Private Sub Command1_Click() 
    With xyz(0) 
    .Param1 = 12 
    .Param2 = "Sonicdater" 
    .Param3 = "http://www.163.org/" 
    .Param4 = 1312 
    .Param5 = 18 
    End With 
    你难道是想声明xyz的书组吗,没有xyz(0)的书组元素,彻底失败了!!!
    先学基础的,一步一步来!!!!!
      

  3.   

    同意visualbaby(好好学习天天向上),你的东西的确有不少毛病,我真是
    看不懂,仔细看看我上面的程序和你原来的程序有什么区别,想一想为什么
    要这样做。一步步来,学习才能进步!
      

  4.   

    下面的程序提供了另一种思路.
    但 有些牵强。
    望各位高手不要见笑 !!!
    ****************************** 
    '在Form中 
    Option Explicit     Private xyz(1 to 2) As MyUDT 
        Dim cls As New clsTest 
        Dim testArray As ArrayUDTPrivate Sub Command1_Click() With xyz(0) 
        .Param2 = "Sonicdater--Yes" 
        .Param4 = 2002
    End With With xyz(1) 
        .Param2 = "Sonicdater--No" 
        .Param4 = 2001
    End With '包装 xyz(1 to 2)With testArray
        .Array(1) = xyz(1)
        .Array(2) = xyz(2)
    End With'传递 testArray 
        cls.mEntryPoint VarPtr(testArray) End Sub ************************ 
    '在模块中 
    Option Explicit Public Type MyUDT 
        Param1 As String * 45 
        Param2 As Long 
    End Type '这里,假设你已定义了Dim xyz(1 to 2) As MyUDT
    '则 在下面结构中数组维数也为 Array(1 to 2)
    '这也是 这段程序牵强的一点。
    '让大家见笑了
    Public Type ArrayUDT
        Array(1 to 2) As MyUDT
    End Type************************** 
    '在类模块cls中 
    Option Explicit Private Declare Sub CopyMemory Lib "kernel32" _ 
    Alias "RtlMoveMemory" _ 
    (pDst As Any, _ 
    pSrc As Any, _ 
    ByVal ByteLen As Long) Public Sub mEntryPoint(ptrType As Long) Dim abc() As MyUDT CopyMemory ByVal abc, ByVal ptrType, ByVal LenB(abc) Debug.Print abc.Array(1).Param1
    Debug.Print abc.Array(1).Param2
    Debug.Print abc.Array(2).Param1
    Debug.Print abc.Array(2).Param2
    '传递完毕
    End Sub 
    ===================================================================
    visualbaby(好好学习天天向上) :
               UDT 结构 一样 能声明 数组。
      

  5.   

    AdamBear(学习再学习) : 
    你的代码中 加上 一个 数组维数的参数后, 也就和我的上面那段一样 变得不太实用了。在我看来, 要自由传递 UDT数组, 必须要用 SafeArray 结构了。
      

  6.   

    感谢AdamBear(学习再学习)帮我调试,确实行了。
    也感谢 visualbaby(好好学习天天向上)对我提出的批评,确实需要大家对我的帮助,因为指针方面我从来没有认真的看过。下来一定好好学学。
    也感谢sonicdater(发呆呆)一直全程的给我提示和帮助。
    佩服你们精湛的功力。
                     有点象在写书的扉页。
                      或者是奥卡颁奖典礼的发言。
                           呵呵呵...
      

  7.   

    还没有,刚刚才将AdamBear(学习再学习) 的试了,他的有一点点小毛病,一直只能传首数组值,刚刚我才调试好了。我再看看你的,但有一点难懂,我仔细看看。
      

  8.   

    sonicdater(发呆呆)
    你的程序我刚刚才调试了,大体意思我明白了,但这种复合结构的声明确实比较牵强啊。维数就定了。我没有调通,但意思我明白了。

    CopyMemory ByVal abc, ByVal ptrType, ByVal LenB(abc)
    中,是否能直接这样使用呢?我没有调通,
    我这样过了,num是传过来的维数。
    CopyMemory ByVal VarPtr(abc(0)), ByVal ptrType, ByVal (num * LenB(abc(0)))
      

  9.   

    抱歉, 打错了
    在 cls 中 的 部分, 定义错了改为: Dim abc() As ArrayUDT 
    你试试。 应该没问题。
    ================================
    这段 代码是 提供给你 另外一种思路, 但 它的 不好之出 就是要
    同时 修改 两个部分数组的 维数。
      

  10.   

    CopyMemory ByVal VarPtr(abc(0)), ByVal ptrType, ByVal (num * LenB(abc(0))) 中的 num 和 维数 无关。 它只 表示在 内存中存放 变量的空间大小。
    比如 Long 型 变量 为 4 byte
         Integer 型变量为 2 byte
         Double 型为 8 byte
      

  11.   

    Public Sub mEntryPoint(ptrType As Long) '把下面的 这句改为 Dim abc() As ArrayUDT 
    Dim abc() As MyUDT CopyMemory ByVal abc, ByVal ptrType, ByVal LenB(abc) Debug.Print abc.Array(1).Param1 
    Debug.Print abc.Array(1).Param2 
    Debug.Print abc.Array(2).Param1 
    Debug.Print abc.Array(2).Param2 
    '传递完毕 
    End Sub 
      

  12.   

    sonicdater(发呆呆(我答问题*不吵架*因为我呆)) 
    你误会了,我的意思是数组的下标!!!xxx(0)!!!