将数组传递到 DLL 过程中

可以传递数组中的单个元素,方法与传递同类型的变量相同。在传递单个元素时,元素被作为基本类型的变量进行传递。例如,可以使用 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》。