跳到内容

Visual Basic/Windows API

来自维基教科书,自由的教学内容

API,即“应用程序编程接口”,允许您访问操作系统或其他应用程序(DLL)公开的大量函数和方法,执行 Visual Basic 提供的标准虚拟机通常未实现的操作。这包括诸如关闭计算机或列出所有当前正在运行的进程的操作。

虽然 VB6 编译器无法创建真正的 DLL,但它具有调用现有 DLL 的功能(当然不仅仅是 Windows API)。此类函数的声明包含额外的关键字 **declare** 和 **lib**,另外可以选择定义一个别名,如果函数的实际名称与 dll 函数的名称不同,则使用 **alias**。例如,它可以是

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long)

对于数据类型 **Any**,编译器接受提供的任何参数。对于 API 调用的有效使用,**VarPtr** 运算符非常重要,它返回指定变量的指针;**AddressOf** 运算符对于回调函数非常重要。初学者经常会在声明中遗漏或错误地指定 ByRef/Byval。简单地说,**ByVal** 表示将值推送到堆栈上,而 **ByRef**(或缺少调用约定的规范)表示将变量的指针推送到堆栈上。在实践中,参数类型 Long(4 字节)将被调用 ByVal,但 String 或复杂数据类型将被调用 ByRef。

不幸的是,VB6 不支持类似 C 的内存处理。为了解决这个问题,VB 程序员使用 CopyMemory 函数来复制内存,如下所示

Dim a As Long
Dim b() As Byte
ReDim b(3)
CopyMemory ByVal varptr(a), ByVal varptr(b), 4

这相对安全。一些知识水平较高的程序员也可以修改对象的指针。虽然大多数 API 函数都可以通过这种方式调用,但对于一般情况,无法动态调用 dll 的入口点(LoadLibrary-GetEntryPoint-FreeLibrary)。处理此类任务的更清晰的方法是将此类代码移至用 C++ 编写的独立 dll 中,并调用该 dll。

声明的示例是 GetTickCount 函数,它返回自 Windows 启动以来经过的毫秒数。要使用它,请将以下内容插入项目中的标准模块

Public Declare Function GetTickCount Lib "kernel32.dll" () As Long

要访问它,只需像调用任何普通函数一样调用它。但是请注意,这是一个 *Public* 声明,并且仅限于模块。如果您不需要它在整个项目中可访问,请使用 *Private* 声明,并将其直接插入类模块或窗体中

Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

对于初学者来说,创建声明语句通常很困难,因为它需要知道如何将 C 数据类型映射到 Visual Basic 数据类型。VB6 附带了一个内置程序,称为 API 文本查看器,它列出了所有常用的 API 函数、常量和类型。VB 程序员只需从该程序中找到所需的函数,并将其插入 VB 模块中。


上一页:数据库 目录 下一页:子类化
华夏公益教科书