下面的示例是 GetTempPath 函数的 Declare 语句,该函数返回 Microsoft® Windows® 临时文件夹的路径:
Private Declare Function GetTempPath Lib "kernel32" _ 关键字 Function 后面的函数名是用来在 VBA 中调用该函数时用的名称。这个名称可以与 API 函数本身的名称相同,或者在 Declare 语句中使用关键字 Alias,表示您打算在 VBA 中用另外的名称(别名)来调用该函数。 在前面的例子中,DLL 中 API 函数的名称是 GetTempPathA,而从 VBA 中调用它的名称是 GetTempPath。 注意 关键字 Alias 后面的是 DLL 函数的真实名称。 一些 API 函数的名称以下划线 (_) 开头,这在 VBA 中是非法的。在 VBA 中必须使用别名来调用某函数。 注意 如果调用的函数位于某一基本的 Windows DLL 中就不存在这种问题,因为要加载应用程序,这些 DLL 肯定存在。 DLL 包括 大部分 DLL 都是用 C 或 C++ 语言编写的,包括那些 Windows API 中的 DLL。因为 C 或 C++ 函数对参数和数据类型的要求在几个方面与 VBA 函数不同,所以,在给 DLL 函数传递参数时,需要对 C 或 C++ 函数要求的参数和数据类型有一定了解。 而且,DLL 函数的许多参数是以传值方式传递的。默认情况下,VBA 中的参数以传址方式传递,所以当 DLL 函数要求参数是以传值方式传递时,必须在函数定义里包含关键字 ByVal。如果函数定义中漏掉关键字 ByVal,可能会在应用程序中引起非法页面错误。或者可能会出现代号为 49 的 VBA 运行时错误,“错误的 DLL 调用约定”。 以传址方式传递参数就是把该参数在内存中的位置传递给被调用的过程。如果该过程修改了参数的值,实际上改变的是该参数唯一的副本,所以当执行返回到调用过程时,参数中包含的是已修改的值。 而以传值方式向 DLL 函数传递参数实际上是传递了该参数的一个副本,函数只对这一副本进行操作。这可以防止函数修改实际参数的内容。当执行返回到调用过程时,参数包含的值与调用其他过程前相同。 因为以传址方式传递允许在内存中修改参数,所以如果以传址方式传递了错误参数,DLL 函数可能会错误地改写内存,从而造成错误或其他意想不到的行为。Windows 有许多值不应该改写。例如 Windows 为每个窗口分配了一个唯一的 32 位标识符,称为句柄。句柄是以传值方式传递给 API 函数的,因为如果 Windows 修改了某窗口的句柄,就不能再跟踪该窗口了。 注意 虽然关键字 ByVal 出现在一些 String 类型的参数前,但字符串总是以传址的方式传递给 Windows API 函数。 |
|站长邮箱|小黑屋|手机版|Office中国/Access中国
( 粤ICP备10043721号-1 )
GMT+8, 2025-4-3 13:49 , Processed in 0.124690 second(s), 16 queries .
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.