Visual Basic 支持的数据类型是相当丰富的,某些动态链接库中的过程不能全部支持这些类型。在将 Visual Basic 变量用于 DLL 过程时,可能会遇到一些特殊情况,下面将对此进行解释。
传递 Null 指针
某些 DLL 过程希望接收到的参数为字符串或 null 值,如果需要将 null 指针传递到字符串参数,需要将参数声明为 As String,并传递常数 vbNullString。
例如,FindWindow 过程能够确定系统中是否有另外的应用程序正在运行。它需要两个字符串参数,一个表示应用程序的类名,另一个表示窗口的标题栏:
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
这两个参数都可以传递 null 值。而传递零长度的字符串 ("") 将不起作用,因为这将传递指向零长度字符串的指针。该指针的值不会是 0。可以用实际值 0 来作为参数传递。为了保证参数的正确性,最简单的办法是使用常数 vbNullString:
hWndExcel = FindWindow(vbNullString, "Microsoft Excel")
处理上述情况的另外一种办法是改写声明部分,将需要传递 null 的参数的数据类型声明为 Long,这样修改以后,在调用时将该参数设置为 0& 即可。如下所示:
Declare Function FindWindowWithNull Lib "user32" -
Alias "FindWindowA" (ByVal lpClassName As Long, _
ByVal lpWindowName As String) As Long
hWndExcel = FindWindow(0&, "Microsoft Excel")
传递属性
属性必须以使用值方式传递。如果某个参数被声明为 ByVal,那么它可以直接传递属性。例如,可以使用下面的过程确定屏幕或打印机的大小(以像素为单位):
Declare Function GetDeviceCaps Lib "gdi32" Alias _
"GetDeviceCaps" (ByVal hdc As Long, _
ByVal nIndex As Long) As Long
还可以将窗体或 Printer 对象的 hDC 属性传递到上面的过程中,从而得到屏幕或当前选定的打印机支持的颜色数,如下所示:
Private Sub Form_Click ()
Const PLANES = 14, BITS = 12
Print "Screen colors ";
Print GetDeviceCaps(hDC, PLANES)* 2 ^ _
GetDeviceCaps(hDC, BITS)
Print "Printer colors ";
Print GetDeviceCaps(Printer.hDC, PLANES) * _
2 ^ GetDeviceCaps(Printer.hDC, BITS)
End Sub
要使用引用方式传递一个属性,必须使用一个中间变量。例如,假设要使用 GetWindowsDirectory 过程来设置一个文件列表框控件的 Path 属性,下面的做法将失败的:
ReturnLength = GetWindowsDirectory(File1.Path,_
Len(File1.Path))
应该使用下面的代码来完成这件工作:
Dim Temp As String, ReturnLength As Integer
Temp = String(255, 0)
ReturnLength = GetWindowsDirectory(Temp, Len(Temp))
Temp = Left(Temp, ReturnLength)
File1.Path = Temp
如果要将数值属性传递到需要使用引用参数的 DLL 过程,同样可以采用上面的技巧。
将句柄用于 DLL
句柄是由操作系统定义的唯一的 Long 类型的值。可以用它来引用窗体和控件等对象。操作环境 DLL 过程大量使用的句柄包括:窗口句柄 (hWnd),设备上下文句柄 (hDC) 等等。如果过程需要用句柄作为参数,则应该把参数声明为 ByVal Long。应该把返回句柄的 DLL 函数声明为 Long 函数。句柄是一种标识符 (ID) 编号,而不是指针或者数字值;不要对它们进行数学运算。
可以传递到 DLL 过程的有效句柄包括:窗体和非图形控件的 hWnd 属性,窗体和图象框控件的 hDC 属性。象其他传递到 DLL 过程的属性一样,只能采用使用值方式。
传递变体值
如果 DLL 过程使用自动化 VARIANT 数据结构访问参数数据,那么 Variant 类型参数的传递类似于其它的参数类型。如果要将 Variant 数据传递到非 Variant 类型的参数,可以使用 ByVal 方式传递 Variant 数据。