作者:杜勇
描述:用于在模块或窗体中声明对动态链接库(DLL)中外部过程的引用,在引用API函数时经常用到。
一、语法:
语法1
[Public|Private]Declare Sub name Lib"libname"[Alias"aliasname"][([arglist])]
语法2
[Public|Private]Declare Function name Lib"libname"[Alias"aliasname"][([arglist])][As type]
Declare语句的语法包含下面部分:
|
部分 |
描述 |
| Public | 可选的。用于声明其引用是全局的(公用的),也就是说该引用的过程在整个工程中都可以使用。Public只能在模块中声明。 |
| Private | 可选的。用于声明其引用是局部的,也就是说只能在该声明所在的模块或窗体中使用。 |
| Sub或Function | 可选的(但二者必须选其一)。Sub表示该过程没有返回值;Function表示该过程会返回一个可用于表达式的值。 |
| Name | 必需的。为合法的过程名。 |
| Lib | 必需的。Declare的子句。 |
| Libname | 必需的。所声明过程的动态链接库名或代码资源名。 |
| Alias | 可选的。表示将被调用的过程在动态链接库(DLL)中还有另外的名称。当动态链接库的过程与同一范围内的公用变量、常数或任何其它过程的名称相同时,可以使用这个参数。 |
| Aliasname | 可选的。动态链接库或代码资源中的过程名。如果首字符不是数字符号(#),则aliasname是动态链接库中该过程的入口处的名称。如果首字符是(#),则随后的字符必须指定该过程的入口处的顺序号。 |
| Arglist | 可选的。代表调用该过程时需要传递的参数列表。 |
| Type | 可选的。Function过程返回值的数据类型;可以是VB变量的各种类型、用户定义类型或对象类型,不支持定长的String。 |
arglist参数的语法以及语法各个部分如下:
[Optional][ByVal|ByRef][ParamArray]varname[()][As type]
|
部分 |
描述 |
| Optional | 可选的。表示参数不是必需的。如果使用该选项,则arglist中的后续参数都必需是可选的,而且必须都使用Optional关键字声明。 |
| ByVal | 可选的。表示该参数按值传递。 |
| ByRef | 可选的。表示该参数按地址传递,是缺省选项。 |
| ParamArray | 可选的。只用于arglist的最后一个参数,表示最后的参数是一个Variant元素的Optional的数组。使用ParamArray关键字可以提供任意数目的参数。ParamArray关键字不能与ByVal、ByRef或Optional一起使用。 |
| Varname | 必需的。代表传给该过程的参数的变量名;遵循标准的变量命名约定。 |
| () | 对数组变量是必需的。指明varname是一个数组。 |
| Type | 可选的。传递给该过程的参数的数据类型;可以是VB变量的各种类型、用户定义类型或对象类型,不支持定长的String。 |
二、说明:
如果引用API函数,可以从API Text Viewer直接将声明复制过来,方法是在程序菜单里选择Microsoft Visual Studio 6.0——Microsoft Visual Studio 6.0 Tools——API Text Viewer,在API Viewer的File菜单里点击Load Text File,打开WIN32API。选择你需要的API函数,添加到Selectde Items里,但要注意根据需要选择Public或Private,然后单击复制。
对Function过程而言,过程的数据类型决定其返回值的数据类型。可以在arglist之后使用As子句来指定函数返回值的数据类型。在arglist中,可以使用As子句来指定任何传给该过程的参数的数据类型。
注意:在Declare语句的参数表中不能使用定长的字符串;只能用变长的字符串。
三、应用举例:
该示例演示如何在使用Declare语句来声明API函数,使某一窗体保持在前面。建立一标准工程,将窗体改名为FrmMain。在窗体上添加一命令按钮,将下面的程序粘贴过去。
Private Sub Command1_Click()
FrmFore.Show '显示第二个窗体
End Sub
在工程上添加一个窗体,改名为FrmFore。在窗体上添加两个命令按钮,将下面的程序粘贴过去。
Option Explicit
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long '声明API函数
Private Sub Command1_Click()
Dim rtn
rtn = SetWindowPos(FrmFore.hwnd, -1, 0, 0, 0, 0, 3)
Me.Caption = "窗体在前"
End Sub
Private Sub Command2_Click()
Dim rtn
rtn = SetWindowPos(FrmFore.hwnd, -2, 0, 0, 0, 0, 3)
Me.Caption = "活动窗体"
End Sub
在工程(Project)菜单打开属性对话框,在对话框中的Starup Object选择FrmMain,然后点击确定。
运行程序时,出现的是第一个窗体,单击显示辅窗体,第二个窗体出现,位于第一个窗体前面。我们分三步来演示这个程序:
一、单击第一个窗体,则第一个窗体到第二个窗体的前面,再单击第二个窗体,第二个窗体又到了前面。
二、这时单击第二个窗体的命令按钮1,然后单击第一个窗体,那么我们可以看到,第一个窗体只被激活,但第二个窗体始终在第一个窗体的前面。
三、最后单击第二个窗体的命令按钮2,此时的情况如同第一步。