vb.netalias的简单介绍

VB 中alias【别名】是啥作用说是别名 , 可是看了相关介绍 , 发现不是一两句话就能说明白的 。一开始我也琢磨了很久 , 因为计算机基础知识有限,所以没法通俗地讲解给你听 。我把我当初记录的电子笔记原封不动粘贴给你看好了,也许你会有更好的理解呢:
Declare语句中的Alias子句是一个可选的部分,用户可以通过它所标识的别名对动态 库中的函数进行引用 。例如,在下面的语句中,声明了一个在VB中名为MyFunction的函数,而它在动态库Mydll.dll中最初的名字是MyFunctionX 。
Private Declare Function MyFunction Lib "Mydll.dll" Alias "MyFunctionX" ( ) As Long
需要注意的是,Alias子句中的函数名是大小写敏感的,也就是说 , 必须与函数在生成时的声明(如在C源文件中的声明)一致 。这是因为32位动态库与16位动态库不同 , 其中的函数名是区分大小写的 。同样道理,如果没有使用Alias子句 , 那么在Function(或Sub)后的函数名也是区分大小写的 。
通常在以下几种情况时需要使用Alias子句:
A.处理使用字符串的系统Windows API过程
如果调用的系统Windows API过程要使用字符串,那么声明语句中必须增加一个Alias 子句,以指定正确的字符集 。包含字符串的系统Windows API函数实际有两种格式:ANSI和Unicode( 关于ANSI和Unicode两种字符集的区别将在后面详细阐述) 。因此,在Windows头文件中,每 个包含字符串的函数都同时有ANSI版本和Unicode版本 。例如,下面是SetWindowText函数 的两种C语言描述 。可以看到,第一个描述将函数定义为SetWindowTextA,尾部的"A" 表明它是一个ANSI函数:
WINUSERAPI BOOL WINAPI SetWindowTextA(HWND hWnd, LPCSTR lpString);
第二个描述将它定义为 SetWindowTextW,尾部的"W" 表明它是一个Unicode 函数:
WINUSERAPI BOOL WINAPI SetWindowTextW(HWND hWnd, LPCWSTR lpString);
因为两个函数实际的名称都不是"SetWindowText",要引用正确的函数就必 须增加一个Alias子句:
Private Declare Function SetWindowText Lib "user32" _
【vb.netalias的简单介绍】Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal _
lpString As String) As Long
应当注意,对于VB中使用的系统WindowsAPI函数,应该指定函数的ANSI版本,因为只 有WindowsNT才支持Unicode版本,而Windows95不支持这个版本 。仅当应用程序只运行 在WindowsNT平台上的时候才可以使用Unicode版本 。
B.函数名是不标准的名称
有时,个别的DLL过程的名称不是有效的标识符 。例如,它可能包含了非法的字符(如连 字符),或者名称是VB的关键字(如GetObject) 。在这种情况下,可以使用Alias关键字 。例 如,操作环境DLLs中的某些过程名以下划线开始 。尽管在VB标识符中允许使用标识符,但是 下划线不能作为标识符的第一个字符 。为了使用这种过程 , 必须先声明一个名称合法的过程,然后用Alias子句引用过程的真实名称:
Declare Function lopen Lib "kernel32" Alias "_lopen" _
(ByVal lpPathName As String, ByVal iReadWrite _
As Long) As Long
在上例中,lopen是VB中使用的过程名称 。而_lopen则是动态连接库中可以识别的名称 。
C.使用序号标识DLL过程
除了使用名称之外,还可以使用序号来标识DLL过程 。某些动态连接库中不包含过程的名称,在声明它们包含的过程时必须使用序号 。同使用名称标识的DLL过程相比,如果使用序号 , 在最终的应用程序中消耗的内存将比较少,而且速度会快些 。但是,一个具体的API的序号 在不同的操作系统中可能是不同的 。例如GetWindowsDirectory在Win95下的序号为432,而在WindowsNT4.0下为338 。总而言之,如果希望应用程序能够在不同的操作系统下运行,那么最好不要使用序号来标识API过程 。如果过程不属于API,或者应用程序使用的范围很有 限,那么使用序号还是有好处的 。

推荐阅读