可以传递数组中的单个元素,方法与传递同类型的变量相同。在传递单个元素时,元素被作为基本类型的变量进行传递。例如,可以使用 sndPlaySound 过程演奏数组中保存的一系列 .wav 文件:
Dim WaveFiles(10) As String
Dim i As Integer, worked As Integer
For i = 0 to UBound(WaveFiles)
worked = sndPlaySound(WaveFiles(i), 0)
Next i
有时需要将整个数组传递到 DLL 过程中。如果 DLL 过程是专门为自动化编写的,那么将数组传递到 DLL 过程的方式与传递到 Visual Basic 过程是相同的:加上空的括号。因为 Visual Basic 使用包括 SAFEARRAY 在内的自动化数据类型,DLL 要得到 Visual Basic 数组参数就必须是能接受自动化的。关于更进一步的信息,请参考特定 DLL 的文档。
如果 DLL 过程不能直接接受自动化 SAFEARRAYs,数值数组仍可以整个进行传递:以引用方式传递数组的第一个单元。因为数值数组数据总是按顺序放在内存中,因此这种办法是可行的。只需要将数组的第一个元素传递到 DLL 过程,该 DLL 就能够访问数组的所有单元。
作为一个例子,可以考虑如何使用 API 调用设置文本框中的制表位。在多行的(但不能是单行的)文本框控件中可以有内部的制表位:如果文本框中的文本中包含制表符(字符编码为 9),制表符后面的文本将与下一个制表位对齐。可以调用 Windows API 中的 SendMessage 函数设置制表位,为此需要将新的制表位设置保存到一个数组中,并将其传递到 API 过程中。
Private Declare Function SendMessageSetTabs Lib _ "user32" Alias "SendMessageA" (ByVal hwnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, _ lParam As Any) As Long Const EM_SETTABSTOPS = &HCB Sub ChangeTabs(anyText As TextBox, tabcount As Integer) Dim i As Integer Dim alngTabs() As Long Dim lngRC As Long ReDim alngTabs(tabcount - 1) For i = 0 To UBound(alngTabs) alngTabs(i) = (i + 1) * 96 '
设置制表位。Next i
'
调用时使用null
指针,指向空的'
制表位数组。lngRC = SendMessageSetTabs(anyText.hwnd, _
EM_SETTABSTOPS, 0, vbNullString)
'
传递数组中的第一个元素;在内存中,'
数组中的其它元素依次排列在它的后面。lngRC = SendMessageSetTabs(anyText.hwnd, _
EM_SETTABSTOPS, tabcount, alngTabs(0))
anyText.Refresh
End Sub
在调用该过程时,需要指定文本框的名字以及需要设置的制表位的个数。如下所示:
Private Sub Command1_Click()
ChangeTabs Text1, 4
End Sub
这种方法也可以用于字符串数组。用 C 语言编写的 DLL 过程将字符串数组作为指向字符串数据的指针的数组,Visual Basic 以同样的方式定义字符串数组。
详细信息 关于 SAFEARRAYs 和其它自动化数据类型的详细信息,请参阅 Microsoft Press 出版的《OLE 2 Programmer's Reference》。