我们都知道,Visual Basic® for Applications (VBA) 是一种功能强大的编程语言,可用来开发自定义 Microsoft Office 解决方案。将 VBA 和一个或多个 Office 应用程序对象模块配合使用,您可以轻松地修改 Office 应用程序的功能,或者使两个或多个应用程序协同工作,从而完成单个应用程序无法完成的任务。VBA 只能控制操作系统的一小部分,即直接向 VBA 公开的那些函数和对象。Windows® 应用程序编程接口 (API) 提供了众多函数,可让您深入控制操作系统的绝大部分内容。您可以从 VBA 中调用 Windows API 函数,扩展和优化自定义 Office 解决方案。
在这个月的专栏中,我将为您简单介绍如何在 VBA 中使用 Windows API,并提供一些有用的示例。您可以复制这些示例,在自己的自定义解决方案中直接使用它们。
警告:调用 Windows API 和其他 DLL 函数可能会影响您的应用程序的可靠性。当您从自己的代码中直接调用 DLL 函数时,会跳过 VBA 在正常情况下提供的一些安全机制。如果您错误地定义或调用 DLL 函数(任何程序员都难免犯这类错误),就可能会产生应用程序错误,也称为常规保护错误,即 GPF。如果使用了 API,那么在运行代码前一定要保存项目,并确保已理解调用 DLL 函数的原理。
理解 API
简单地说,API 就是您用来控制组件、应用程序或操作系统的一组函数。API 通常包含一个或多个可以提供某些特定功能的 DLL。
DLL 是一些包含任何 Windows 应用程序都可以调用的函数的文件。在运行过程中,DLL 中的函数“动态地链接”到调用它的应用程序中。不管有多少个应用程序调用 DLL 中的函数,该函数只存在于驱动器上的一个单一的文件中,并且该 DLL 在内存中只创建一次。
您最常听说的 API 可能是 Windows API,它包含组成 Windows 操作系统的所有 DLL。每个 Windows 应用程序都直接或间接地与 Windows API 交互作用。Windows API 可以保证所有在 Windows 中运行的应用程序都按照统一的方式运行。
除了 Windows API 外,还有其他一些公开的 API。例如,邮件应用程序编程接口 (MAPI) 是用于编写电子邮件应用程序的一组 DLL。
传统上 API 是为那些创建 Windows 应用程序的 C 和 C++ 程序员编写的,但使用 VBA 也可以调用 DLL 中的函数。由于大部分 DLL 及其文档最初是为 C/C++ 程序员编写的,所以调用 DLL 函数和调用 VBA 函数可能会有所不同。为了使用 API,您需要了解如何向 DLL 函数传递参数。
为了调用 Windows API 中的函数,您需要参考有关文档,了解有哪些函数可供使用以及如何在 VBA 中声明和调用这些函数。以下是两个很有用的资源:
1. 文件 Win32API.txt,包含在 Microsoft Office 2000 Developer 和 Microsoft Visual Basic 中。文件 Win32API.txt 包含了大部分 Windows API 函数所使用的 VBA Declare 语句。您可以使用 API Viewer 外接程序(同样包含在 Office 2000 Developer 中)来查找和复制您需要的 Declare 语句。有关安装和使用 API Viewer 外接程序的信息,请参阅 Office 2000 Developer 中的 apiload.txt 文件。Microsoft Visual Basic 附带的 API Viewer 应用程序具有相同的功能,只不过它是一个独立的应用程序。
初次运行 API Viewer 应用程序时,它将加载 Win32API.txt 文件。该文本文件可以导出到一个 Microsoft Access 数据库(.mdb 文件)中,这样能加速加载和浏览 API 数据的过程。
2. Microsoft Platform SDK,包含完整的 Windows API 文档。它可以在 Microsoft Developer Network 站点上免费获得(英文)。
使用 Declare 语句
在从 VBA 调用 DLL 中的函数前,您必须先告诉 VBA 该函数位于何处以及如何调用它。有两种方法可以实现这一目的:
1. 设置 DLL 类型库的引用。
2. 在模块中使用 Declare 语句。
设置 DLL 类型库的引用是使用 DLL 函数的最简单的方法。一旦设置了引用,您便可以调用 DLL 函数,就好象它是项目中的一部分。然而,这里有一些需要注意的地方。首先,设置引用多个类型库会影响应用程序的性能。其次,并非所有 DLL 都提供类型库。尽管可以设置引用一个不提供类型库的 DLL,但却不能象将其作为项目中的一部分那样调用该 DLL 中的函数。
请注意,组成 Windows API 的 DLL 不提供类型库,因而不能通过设置引用这些 DLL 来调用其中的函数。要调用 Windows API 中的函数,您必须在项目中的模块声明部分插入一条 Declare 语句。
Declare 语句是一条定义语句,它告诉 VBA 从何处获得特定的 DLL 函数以及如何调用该函数。在代码中添加 Declare 语句的最简单方法是使用 API Viewer 外接程序,该程序包含了大部分 Windows API 函数所使用的 Declare 语句,以及一些函数需要的常量和类型定义。
下例所示为 GetTempPath 函数的 Declare 语句,该函数将返回 Windows 临时文件夹的路径(默认情况下为 C:\Windows\Temp