VB.NET使用Alias子句简介

开发 后端
这里介绍VB.NET使用Alias子句,如果没有VB.NET使用Alias子句,那么在 Function(或Sub)后的函数名也是区分大小写的。

学习VB.NET时,你可能会遇到VB.NET使用Alias子句问题,这里将介绍VB.NET使用Alias子句问题的解决方法,在这里拿出来和大家分享一下。

Declare语句中的Alias子句是一个可选的部分,用户可以通过它所标识的别名对动态 库中的函数进行引用。例如,在下面的语句中,声明了一个在VB中名为MyFunction的函数,而它在动态库Mydll.dll中最初的名字是MyFunctionX。

  1. Private Declare Function MyFunction Lib "Mydll.dll" _Alias "MyFunctionX" ( ) As Long  

需要注意的是,Alias子句中的函数名是大小写敏感的,也就是说,必须与函数在生成时的声明(如在C源文件中的声明)一致。这是因为32位动态库与16位动态库不同,其中的函数名是区分大小写的。同样道理,如果没有VB.NET使用Alias子句,那么在 Function(或Sub)后的函数名也是区分大小写的。

通常在以下几种情况时需要VB.NET使用Alias子句:

1.处理使用字符串的系统Windows API过程

如果调用的系统Windows API过程要使用字符串,那么声明语句中必须增加一个Alias 子句,以指定正确的字符集。包含字符串的系统Windows API函数实际有两种格式:ANSI和Unicode(关于ANSI和Unicode两种字符集的区别将在后面详细阐述)。因此,在Windows头文件中,每个包含字符串的函数都同时有ANSI版本和Unicode版本。例如,下面是SetWindowText函数的两种C语言描述。可以看到,第一个描述将函数定义为SetWindowTextA,尾部的"A" 表明它是一个ANSI函数:

  1. WINUSERAPI BOOL WINAPI SetWindowTextA(HWND hWnd, LPCSTR lpString);  

第二个描述将它定义为 SetWindowTextW, 尾部的"W" 表明它是一个 Unicode 函数:

  1. WINUSERAPI BOOL WINAPI SetWindowTextW(HWND hWnd, LPCWSTR lpString);  

因为两个函数实际的名称都不是"SetWindowText",要引用正确的函数就必 须增加一个Alias子句:

  1. Private Declare Function SetWindowText Lib "user32" _  
  2. Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal _  
  3. lpString As String) As Long 

应当注意,对于VB中使用的系统WindowsAPI函数,应该指定函数的ANSI版本,因为只 有WindowsNT才支持Unicode版本,而Windows95不支持这个版本。仅当应用程序只运行 在WindowsNT平台上的时候才可以使用Unicode版本。

2.函数名是不标准的名称

有时,个别的DLL过程的名称不是有效的标识符。例如,它可能包含了非法的字符(如连字符),或者名称是VB的关键字(如GetObject)。在这种情况下,可以使用Alias关键字。例如,操作环境DLLs中的某些过程名以下划线开始。尽管在VB标识符中允许使用标识符,但是下划线不能作为标识符的第一个字符。为了使用这种过程,必须先声明一个名称合法的过程,然后VB.NET使用Alias子句引用过程的真实名称:

  1. Declare Function lopen Lib "kernel32" Alias "_lopen" _  
  2. (ByVal lpPathName As String, ByVal iReadWrite _  
  3. As Long) As Long 

在上例中,lopen是VB中使用的过程名称。而_lopen则是动态连接库中可以识别的名 称。

3.使用序号标识DLL过程

除了使用名称之外,还可以使用序号来标识DLL过程。某些动态连接库中不包含过程的名称,在声明它们包含的过程时必须使用序号。同使用名称标识的DLL过程相比,如果使用序号,在最终的应用程序中消耗的内存将比较少,而且速度会快些。但是,一个具体的API的序号在不同的操作系统中可能是不同的。例如GetWindowsDirectory在Win95下的序号为432,而在WindowsNT4.0下为338。总而言之,如果希望应用程序能够在不同的操作系统下运行,那么最好不要使用序号来标识API过程。如果过程不属于API,或者应用程序使用的范围很有限,那么使用序号还是有好处的。

要使用序号来声明DLL过程,Alias子句中的字符串需要包含过程的序号,并在序号的 前面加一个数字标记字符(#)。例如,Windowskernel中的GetWindowsDirectory函数的序 号为432;可以用下面的语句来声明该DLL过程:

  1. Declare Function GetWindowsDirectory Lib "kernel32" _  
  2. Alias "#432" (ByVal lpBuffer As String, _  
  3. ByVal nSize As Long) As Long 

在这里,可以使用任意的合法名称作为过程的名称,VB将用序号在DLL中寻找过程。

为了得到要声明的过程的序号,可以使用Dumpbin.exe等实用工具(Dumpbin.exe是Microsoft VisualC++提供的一个实用工具,它的使用说明可以参见VC的文档)。利用Dumpbin,可以提取出.dll文件中的各种信息,例如DLL中的函数列表,它们的序号以及与代码有关的其它信息。

【编辑推荐】

  1. 详细描述VB调用动态连接库
  2. 叙述VB.NET创建控件数组
  3. 浅析VB.NET绘制GDI图形的方法
  4. 讲解VB.NET访问注册表方法
  5. 概括VB.NET获取网卡地址的步骤
责任编辑:佚名 来源: IT168
相关推荐

2009-10-12 14:13:00

VB.NET使用局部变

2009-11-02 17:54:44

VB.NET数组

2009-10-28 17:44:31

VB.NET语言

2009-10-14 13:21:46

VB.NET Acco

2009-10-15 09:16:35

VB.NET重新申明数

2009-10-30 15:37:23

VB.NET Sub创

2010-01-11 16:04:10

VB.NET使用wit

2009-10-14 17:08:44

VB.NET使用Fil

2009-11-03 13:48:02

VB.NET枚举

2009-10-26 15:57:07

VB.NET使用Ora

2010-01-15 16:29:47

VB.NET对象存储

2009-10-28 12:28:52

VB.NET资源使用

2009-10-12 16:39:59

OracleTransVB.NET使用

2009-11-03 11:27:30

VB.NET界面

2009-10-16 10:14:26

VB.NET使用Fil

2009-11-02 13:54:27

VB.NET shel

2009-10-13 15:20:02

VB.NET使用Dra

2009-10-12 13:11:48

VB.NET使用线程

2009-10-20 10:29:30

VB.NET使用Sor

2010-01-18 18:20:49

VB.NET使用API
点赞
收藏

51CTO技术栈公众号