某些 DLL 过程使用自定义的类型作为参数。(在 C 语言中,自定义类型被称为“结构”,在 Pascal 中被称为“记录”。)正如数组的情况,如果要传递自定义类型的单个成员,只需将其作为一般的数值或字符串变量即可。
可以将整个的自定义类型作为一个参数传递,这时需要使用引用方式。自定义类型不能以使用值方式传递。Visual Basic 将传递第一个成员的地址,在内存中其它成员存储在第一个的后面。在有的操作系统上,成员之间可能存在空隙。
例如,操作系统环境 DLL 中的某些过程能够接受自定义的表示矩形的数据类型,它的结构如下:
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
下面使用两个接受矩形的过程:DrawFocusRect,在指定的矩形周围绘制虚框;InvertRect,翻转指定矩形的颜色。要使用这些过程,首先在标准模块的声明部分进行声明:
Declare Function DrawFocusRect Lib "User32" Alias _
"DrawFocusRect" (ByVal hdc As Long, _
lpRect As RECT) As Long
Declare Function InvertRect Lib "User32" Alias _
"InvertRect" (ByVal hdc As Long, _
lpRect As RECT) As Long
Dim MouseRect As RECT
现在可以使用下面的 Sub 过程调用 DLL:
Private Sub Form_MouseDown (Button As Integer, _
Shift As Integer, X As Single, Y As Single)
ScaleMode = 3
If Button And 1 Then
MouseRect.Left = X
MouseRect.Top = Y
MouseRect.Right = X
MouseRect.Bottom = Y
End If
End Sub
Private Sub Form_MouseUp (Button As Integer, _
Shift As Integer, X As Single, Y As Single)
ScaleMode = 3
If Not (Button And 1) Then
MouseRect.Right = X
MouseRect.Bottom = Y
InvertRect hDC, MouseRect
End If
End Sub
Private Sub Form_MouseMove (Button As Integer, _
Shift As Integer, X As Single, Y As Single)
ScaleMode = 3
If Button And 1 Then
DrawFocusRect hDC, MouseRect
MouseRect.Right = X
MouseRect.Bottom = Y
DrawFocusRect hDC, MouseRect
End If
End Sub
自定义类型的成员可以是对象、数组以及 BSTR 字符串,尽管接受自定义类型的大部分 DLL 过程不希望自定义类型中包含字符串数据。如果字符串成员是固定长度的字符串,它们对于 DLL 将等同于以空字符结束的字符串,在内存中的存储方式也与其它值相同。自定义类型中的变长字符串实际是一组指向字符串数据的指针。每个变长字符串成员需要 4 个字节。
注意 如果要将包含二进制数据的自定义类型传递到 DLL 过程中,需要将二进制数据储存在 Byte 数据类型的变量数组中,不要将其存储在 String 变量中。字符串是假定用来存储字符的,如果将二进制数据作为 String 变量传递,外部过程可能读到错误的结果。