'研究了一下,至少你的问题不用什么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'结果字串正常输出。
' 下面的程序已经调试通过'在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'结果字串正常输出。
解决方案 »
- Select f2 as p1,f8 as p2 from table中的as p1的数据类型定义
- 动态dim?redim?
- 问下如何获取和设置鼠标的位置?
- 如何使用vb访问access数据库
- 使用ActiveReport报表若干问题!(江糊救急)
- 大家是如何实现在sql server数据库相关表中插入记录,我先来抛块砖引出大家的玉
- ??怎么回事?急!
- 高手请看:"run-time error '-2147467259(80004005)':不能再打开其他表了"这是什么错误啊
- 怎样将一个窗体文本框里的内容显示在另一个窗体的下拉列表里??!!
- 如何使运行的程序在System Tray上显示图标?
- 关于中文字符问题?十万火急!!!!!!!!!!!
- 如何实现TreeView热滚动。~~~~万分火急~~
byval abc是你目的地址,必须用自定义数组的第一个成员明确声明,
并且目的地址的长度应明确并且足够厂,如果不知道确切长度,可以用ubound
提前得到。否则极易出现地址越界。
另外,Option Explicit
Declare Function VarPtrStringArray Lib "msvbvm60.dll" Alias "VarPtr" _
(Var() As Any) As Long 并没有被你声明称类clsTest的一个方法,你怎么可以直接调用clsTest.mEntryPoint VarPtrStringArray(xyz)
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)的书组元素,彻底失败了!!!
先学基础的,一步一步来!!!!!
看不懂,仔细看看我上面的程序和你原来的程序有什么区别,想一想为什么
要这样做。一步步来,学习才能进步!
但 有些牵强。
望各位高手不要见笑 !!!
******************************
'在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 结构 一样 能声明 数组。
你的代码中 加上 一个 数组维数的参数后, 也就和我的上面那段一样 变得不太实用了。在我看来, 要自由传递 UDT数组, 必须要用 SafeArray 结构了。
也感谢 visualbaby(好好学习天天向上)对我提出的批评,确实需要大家对我的帮助,因为指针方面我从来没有认真的看过。下来一定好好学学。
也感谢sonicdater(发呆呆)一直全程的给我提示和帮助。
佩服你们精湛的功力。
有点象在写书的扉页。
或者是奥卡颁奖典礼的发言。
呵呵呵...
你的程序我刚刚才调试了,大体意思我明白了,但这种复合结构的声明确实比较牵强啊。维数就定了。我没有调通,但意思我明白了。
在
CopyMemory ByVal abc, ByVal ptrType, ByVal LenB(abc)
中,是否能直接这样使用呢?我没有调通,
我这样过了,num是传过来的维数。
CopyMemory ByVal VarPtr(abc(0)), ByVal ptrType, ByVal (num * LenB(abc(0)))
在 cls 中 的 部分, 定义错了改为: Dim abc() As ArrayUDT
你试试。 应该没问题。
================================
这段 代码是 提供给你 另外一种思路, 但 它的 不好之出 就是要
同时 修改 两个部分数组的 维数。
比如 Long 型 变量 为 4 byte
Integer 型变量为 2 byte
Double 型为 8 byte
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
你误会了,我的意思是数组的下标!!!xxx(0)!!!