将自定义的数据类型传递到 DLL 过程

某些 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 变量传递,外部过程可能读到错误的结果。