VB与API
之所以写这篇文章(而不写VC或其他语言),是因为VB对API的支持不是直接的,而且是不完全的; 在使用上,Windows的API编写时是假设调用者是C或C++语言,因此VB调用API不是很方便,也经常有不必要的错误或不明白如何使用的情况出现。本文的对象主要还是对API没有很深研究的读
者,如果你不想了解太多细节,你可以把一个合适的函数用法搬过去,或者你完全不知道API,或者只知道少数,对许多函数还不清楚如何使用,或者你希望可以从本文学到更多使用API的技巧甚至VB的技巧(但愿我可以让你学到),我想你都应该看这篇文章。但还是有个大前提,你必须是已经会使用VB的读者,因为以后讲到的内容不会有一个完整工程从头到尾教你做,有可能是一段简短的声明与调用代码,也可能是几个函数的组合,如果必要的话,也会讲述相关内容的VB技巧,但一定不会有完整的实例示范。
基础知识
在讲API之前,让我先讲解一些与API相关的VB基础知识,后文如有涉及将不再详述。此处未提及的,将在本文中第一次接触时再做解释。
1.自定义类型
VB中可以使用Type关键字将已有的数据类型进行组合,成为一个新的类型,该类型就称为用户自定义类型。如:
Type NewType
sName As String
lNumber As Long
End Type
定义了一个名为NewType的自定义类型。以后可以用Dim MyType As NewType来定义一个NewType类型的变量。
sName As String类型的变量有两种,一种是变长,即运行时的字符串长度是可变的,另一种是定长,运行时字符串的长度是固定的。平常我们定义一个字符串变量: Dim strA As String 即定义了一个变长的字符串,但在使用API时经常要用到定长的字符串,应该这样定义: Dim strB As String * 30,即定义了一个可容纳30个字节字符的变量。
2.声明
VB中使用API之前,需要先对API进行声明,声明的方法是使用Declare关键字,如:
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
声明了一个名为SendMessage的API函数。许多API的声明可以在API浏览器中找到,而且本文在讲述一个API时也会给出声明,更深入的知识将在以后讲述。
3.句柄
API中使用得最多的一个词大概就是“句柄”了。如果要说得复杂些,句柄的确可以说上一大堆,不过作为VB的应用,我们可以更简单地去理解它。可以这么说,句柄是Windows系统赋予内存中每一个对象,包括窗口、按钮(其实也是一种窗口)或者文件、图标、菜单等等所有东西的标识。所谓标识就如身份证一样,是不会重复并且和实际对象是一一对应的。它的作用是让Windows知道将被操作的对象是谁。许多VB控件都提供了一个长型的hWnd属性,一般情况下,这个属性就是这个控件的句柄,用API控制这个控件时就需要用到这个属性了。
4.设备上下文
其实我觉得“设备上下文”这个词读起来很奇怪,不过就其字面来看,Device Context(DC,可不是直流电或DreamCast哦)就是这个意思,许多人也这么称它。不过我想翻译为“设备中介”大家应该更容易理解吧。它的作用是作为计算机设备和程序之间的中介,比如显示器和程序之间,或者打印机和程序之间。在对这些设备操作的时候,是需要通过这个中介操作的(与句柄相似),一些控件,如 Picture,想在上面画图时,就要用到hDC属性了。
5.显式声明与自动保存
在默认情况下,Visual Basic会把未声明的变量认为是新变量(即使是你不小心打错字了),这样很容易出现错误,而且要找出这样的错误往往很不容易。加上API的操作基本上都会涉及到系统本身,一旦出错就有可能出现Visual Basic崩溃甚至系统崩溃。所以到Visual Basic的选项设置中选上Require Variable Declaration(需要变量声明)。在 Enviroment(环境)页中的When a program starts(当程序启动时)处选上Prompt To Save Changes(提示保存)或 Save Changes(自动保存)。这样Visual Basic会检查变量是否已经声明,不再允许没有声明的变量出现了。
6.API浏览器
前面讲“声明”的时候提到了API浏览器,这里也说一说它。在安装完VB时,安装程序会把API浏览器复制到你的计算机里。启动后界面如图1(以VB6 为准)。可以看到,从API浏览器里我们可以得到API的声明、常量值以及与API相关的自定义类型的定义。其中Declare Scope(声明范围)是指该声明是公有的还是私有的。对于在标准模块中的声明,如果声明为私有,则只对该模块有效,如果为公有,则对整个程序都有效。在窗体模块中只能声明为私有。
7.MSDN
MSDN是微软发布的一套完整的Windows开发者技术文档(如图2)。里面不仅有VB、 VC++、VFP、MSDEV、VSS等开发工具的完整帮助,而且包含了Windows平台开发的几乎所有的技术资料,并不断地更新。我们需要的API资料这里都有很详细的说明,包括使用平台、参数类型、参数作用等(当然它并非完全正确,错误的地方也时有出现)。不过作为以C为基础的API,这里的资料是英文的,而且格式也是C语言格式。想要读懂,那你的英文水平和C语言就要有两把刷子了。不过不必担心,它只是我建议一定要有的参考文档,最重要的还是我接下来要讲的内容,它不仅是中文的,还是VB的,又有使用示例,还有相关知识讲解。记住MSDN只是参考文档,作用就好像字典,可千万不要买了一套MSDN就跑去跟别人说你已经变得多厉害了,不然……
顺便说一说,以前的MSDN是双CD的,现在已经变成3CD了。如果买的话应尽量买最新的(但没有必要每次更新都换一套),因为更新的版本把一些错误改正了,并增加了新的内容,比如最新的MSDN已经增加了许多Windows XP的内容。你可以从微软的中国网站订到这套文档,不过一年的价钱从一万几到三万几,买不起的话……自己想办法吧。
好了,开篇写了这么多,无非也是想让读者在以后可以更容易理解所讲的内容。这些是基础,是一定要记住的。下面我们就先介绍一个比较简单的API,开始我们的API之旅吧!
摘自 田志良 的博文