background image

那么,别名究竟有什么用途呢?从理论上讲,别名提供了用另一个名子调用 API 的函数方

 

法。如果你指明了别名,那么 尽管我们按 Declare 语句后面的函数来调用该函数,但在函
数的实际调用上是以别名作为首要选择的。如,以下两个函数(Function,ABCD)声明都是有

 

效的,他们调用的是同一个 SetFocus 函数∶
Declare Function SetFocus Lib "user32" "SetFocus" (ByVal hwnd As Long) As Long
Declare ABCD SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long

需要注意的是,选用 Alias 的时候,应注意别名的大小写;如果不选用 Alias 时的时候,
函数名必须注意大小写,而且不能改动。当然,在很多情况下,由于函数声明是直接从
API
文本游览器中拷贝过来的,所以这种错误的发生机会是很少的,但您有必要知道这一点。
最后提醒你一句,API 声明(包括结构、常数)必须放在窗体或模块的"通用(General 
Declarations)

 

段。

数据类型与"类型安全"  
API 函数中使用的数据类型基本上和 VB 中的一样。但作为 WIN32 的 API 函数中,不存在
Integer
数据类型。另外一点是在 API 函数中看不到 Boolean

 

数据类型。 Variant 数据类型在 API 函

数中是以 Any 的形式出现,如 Data As Any。尽管其含义是允许任意参数类型作为一个该
API 函数的参数传递,但这样做存在一定的缺点。其原因是,这将会使得对目标参数的所
有类型检查都会被关闭。这自然会给各种类型的参数调用带来了产生错误的机会。

为了强制执行严格的类型检查,并避免上面提到的问题,一个办法是在函数里使用上面
提到到 Alias 技术。如对 API

 

函数 GetDIBits 可进行另外一种声明方法。如下∶

GetDIBits 函数的原型∶
Public Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal 
hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI 
As BITMAPINFO, ByVal wUsage As Long) As Long
GetDIBits 函数的改型∶

Public Declare Function GetDIBitsLong Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, 
ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As 
Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long

 

通过本课程前面所学到的知识,我们已经可以得知原型 GetDIBits 函数也好,改型 
GetDIBitsLong 函数也好,实际将调用的都是 Alias

 

所指定的 GetDIBits 原函数。但你应当

看到,两者的区别在于,我们在改型的函数中强制指定 lpBits 参数为 Long 形。这样就会
使得函数调用中发生的错误机率减少到了最小。这种方法叫做"安全类型"声明。

API 函数中经常看到的数据类型有∶Long,String,Byte,Any....(也就这些吧。) 

   

常 数

对于 API 常数来讲,没有什么太特别的学问。请看 VB 中的以下代码∶
Msg = MsgBox("您好", vbOKCancel)

 

我们知道, vbOKCancel 这个常数的值等于 1。对上面的代码我们完全可以这样写,而不