Decalre声明语句
采用Declare语句的方式声明API,没有返回值的函数的格式如下:
[ <attrlist>] [ Public | Private | Protected | Friend | Protected Friend ] [ Shadows ]Declare [ Ansi | Unicode | Auto ] [ Sub ] name
Lib "libname"[ Alias "aliasname" ] [([arglist
])]
若函数有返回值,则格式如下:
[ <attrlist>] [ Public | Private | Protected | Friend | Protected Friend ] [ Shadows ]Declare [ Ansi | Unicode | Auto ] [ Sub ] name
Lib "libname"[ Alias "aliasname" ] [([ arglist
])] [Astype]
每一个部分的说明简述如表3.1.1。
Arglist为函数的参数列表,函数中的参数数目因不同的函数而不同,但均符合下列的格式:
[ <attrlist>][ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname
[()] [ As type
]
上述程序中每一部分的说明如表3.1.2。
表3.1.2 参数列表使用方式说明
项 目 |
说明 |
attrlist |
选择项。套用至这个自变量的特征项(Attribute)列表。特征项之间以逗号来分隔 |
Optional |
选择项。表示自变量不是必要项。如果使用,arglist 当中接下来的所有自变量都必须是选择项,并使用Optional关键字来声明。如果使用ParamArray,则任何自变量都无法使用Optional |
ByVal |
选择项。表示自变量是由传值方式传递,默认值是ByVal |
ByRef |
选择项。表示自变量是由传址方式传递 |
ParamArray |
选择项。只用来当作arglist中的最后一个自变量,以表示最后一个自变量是有着Object元素的Optional数组。ParamArray关键字允许提供任意数目的自变量。ParamArray关键字不能和ByVal、ByRef或 Optional一起使用 |
varname |
必要项。变量名称,用来代表传递至程序的自变量;这是依照标准变量命名规格来命名的 |
( ) |
数组变量的必要项。表示varname为数组 |
type |
选择项。传递至程序的自变量数据类型,可以是 Byte、Boolean、Char、Short、Integer、Long、Single、Double、Decimal、String (仅限可变长度)、Object、用户定义类型或对象类型 |
attrstr专门用来描述特征项,所谓的特征项是描述性标记,它提供与程序设计项目相关的其他信息,例如类型、字段、方法和属性。其他应用程序可以参考特征项中的额外信息来判断如何使用这些项目。特征项会与Visual Basic .NET组件(Assembly)的中继数据一起存储,其中包含调试和内存回收所需的信息,以及安全性特征项、封送处理数据、扩充类别和成员定义、版本绑定和运行库(Runtime)所需的任何其他信息。
特征项在程序中的用法有多种,在本书将使用的为以下两种。
(1) 描述与机器码相互操作时如何封送处理方法参数,这将使用MarshalAsAttribute类别。通用语言运行库(Common Language Runtime)封送处理字符串参数为BStr,但所引用函数中的字符串处理方式可能不是BStr,这种情形下,可以使用MarshalAsAttribute特征项封送处理字符串为LPStr、LPWStr、LPTStr或BStr其中的一种。这样就可符合函数的原始定义。
BStr是固定长度双字节的Unicode字符字符串;LPStr是单一字节、以Null字符结束的ANSI字符字符串;LPWStr是2 字节、以Null字符结束的Unicode字符字符串;LPTStr则是平台相依字符字符串,在Windows 98上为ANSI,在 Windows NT 和Windows XP上为Unicode。
(2) 使用DllImportAttribute类调用Unmanaged程序代码。这部分在下一小节说明。
以下的程序代码调用函数MessageBox,并且将函数名称改为MBox,而字符串的调用则指定为Auto(表示自动转换)。
Declare Auto Function MBoxLib "user32.dll" Alias "MessageBox" (ByVal hWnd As Integer, ByVal txt As String, ByValText As String, ByVal Typ AsInteger) As Integer
以下的程序代码则是调用创建通信用的设备控制区块(Device Control Block,DCB),其中使用了MarshalAs特征项,用来指明字符串的封送方式,命令.NET环境依此方式传送参数给API函数。
Declare Function Lib "user32.dll" BuildCommDCB(<MarshalAs(UnmanagedType.LPStr)> ByVal lpDef As String, ByRef lpDCB As DCB) As Integer
有了上述知识的了解,配合特征项的使用,就可以成功地声明函数。