Access编程交流网
  • 设为首页|收藏本站|繁体中文|手机版
  •     
  • Access培训-Access开发平台-Access行业开发

  • 首页
  • 资讯
  • 技巧
  • 源码
  • 行业
  • 资源
  • 活动
  • 关于

技巧

ACCESS数据库

启动/设置/选项/背景

修复/压缩

安全/加密/解密

快捷键

版本升级/其它等

数据表

命名方式/设计规范

表设计

查询

Sql语言基础

选择查询

更新查询

删除查询

追加查询

生成表查询

交叉表查询

SQL特定查询

查询参数

查询综合应用

界面/窗体/控件

标签

文本框

命令按钮

组合框/列表框

选项组/复选框/选项按钮

选项卡

子窗体

窗体本身/综合应用

其它

报表打印

报表设计

高级报表

模块/函数/VBA/API/系统

VBA基础

内置函数

调试/跟踪/Debug

模块/类模块

API/COM/系统相关

字符数字日期

网络通信游戏

加密解密安全

文件处理

经典算法

宏/菜单/工具栏/功能区

宏/脚本

菜单/工具栏

功能区/Ribbon

图表/图形/图像/多媒体

图表

图形/图像

音频

视频/动画

DAO/链接表/ADO/ADP

DAO/链接表/ODBC

ADO/RDO

ADP

ActiveX/第三方控件/插件

Treeview树控件

ListView列表控件

Toolbar工具栏控件

微软其它控件

Dbi-Tech

CodeJock

Grid++Report

FastReport

ComponentOne

加载项/插件/Addin

OFFICE集成/导入导出/交互

Excel导入导出/交互

Word导入导出/交互

PPT交互

Outlook控制/邮件

Text文本文件/INI/CSV

PDF/SWF/XML格式

CAD格式

Sharepoint/其它Office

SqlServer/其它数据库

表

视图

存储过程/触发器

函数

用户/权限/安全

调试/维护

SqlServer其它/综合

发布/打包/文档/帮助

开发版/运行时

打包/发布/部署

开发文档/帮助制作

Access完整行业系统

采购管理系统

销售管理系统

仓库管理系统

人力资源管理HRM

CRM管理系统

MRP/ERP管理系统

BRP/流程优化

其它管理系统

心得/经验/绝招
其它/杂项
Excel技巧

Excel应用与操作

Excel开发编程

Word技巧

Word应用与操作

Word开发编程

Outlook技巧

Outlook应用与操作

Outlook开发编程

热门文章

  • Access API集中营..
  • 别让 MsgBox 中断了..
  • Windows API 函..
  • 快速读取 TextBox ..
  • 如何隐藏及再显示鼠标
  • Access设置数字/大写..

最新文章

  • Access API函数分..
  • Access VBA 注册..
  • Access Excel ..
  • 毫秒级和纳秒级计时的API..
  • 一种比GetTickCou..
  • VB用PrevInstan..

联系方式

Access交流网(免费Access交流)

QQ:18449932 

网  址:www.access-cn.com

当前位置:首页 > 技巧 > 模块/函数/VBA/API/系统 > API/COM/系统相关
API/COM/系统相关

剖析 Declare 语句

下面的示例是 GetTempPath 函数的 Declare 语句,该函数返回 Microsoft® Windows® 临时文件夹的路径:

Private Declare Function GetTempPath Lib "kernel32" _
Alias "GetTempPathA" (ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long
关键字 Declare 告诉 VBA 您想在自己的项目中加入一个 DLL 函数定义。标准模块中的 Declare 语句可以是公共或私有的,这取决于您是想只让某个模块使用该 API 函数还是整个项目均可用。在类模块中,Declare 语句必须是私有的。

关键字 Function 后面的函数名是用来在 VBA 中调用该函数时用的名称。这个名称可以与 API 函数本身的名称相同,或者在 Declare 语句中使用关键字 Alias,表示您打算在 VBA 中用另外的名称(别名)来调用该函数。

在前面的例子中,DLL 中 API 函数的名称是 GetTempPathA,而从 VBA 中调用它的名称是 GetTempPath。

注意 关键字 Alias 后面的是 DLL 函数的真实名称。
注意 GetTempPath 是 Win32API.txt 文件给该函数起的别名,您可把它更改为任何想要的名称。
在 Declare 语句中使用别名的原因有以下几点:

一些 API 函数的名称以下划线 (_) 开头,这在 VBA 中是非法的。在 VBA 中必须使用别名来调用某函数。
因为别名允许程序员随意给 DLL 函数命名,使函数名符合您在 VBA 中的命名标准。
因为 API 函数区分大小写而 VBA 函数不区分,所以可使用别名来更改函数名的大小写。
一些 DLL 函数带有能接受不同数据类型的参数。这些函数的 VBA Declare 语句把这些参数的类型定义为 Any。调用声明了 Any 类型参数的 DLL 函数有一定的风险,因为 VBA 不做任何数据类型检查。如果想避免这种传递 Any 类型参数带来的危险,可以声明同一个 DLL 函数的多个版本,每个都有不同的名称和数据类型。
在 Windows API 中,所有带有字符串参数的函数都有两个版本:一个 ANSI 版本和一个 Unicode 版本。ANSI 版的函数名带有后缀 "A"(见前面的例子),而 Unicode 版的后缀是 "W"。虽然 VBA 内部使用 Unicode 版本,但它在调用 DLL 函数前会把所有的字符串转为 ANSI 字符串,所以,在 VBA 中调用 Windows API 函数时一般都用 ANSI 版。API 查看器外接程序自动给所有带有字符串参数的函数取别名,所以在调用函数时不必包括后缀 "A"。
关键字 Lib 指明要调用的函数在哪个 DLL 中。请注意,在 Declare 语句里,DLL 的名称被包含在一个字符串中。如果用户的系统中找不到关键字 Lib 后面指定的 DLL,对函数的调用将失败,并产生一个代号为 48 的运行时错误,“调用 DLL错误”。由于这种错误可在 VBA 代码中处理,所以可以编写代码来体面地应付错误。

注意 如果调用的函数位于某一基本的 Windows DLL 中就不存在这种问题,因为要加载应用程序,这些 DLL 肯定存在。
下表给出了 Windows API 中最常用的的 DLL。

DLL 包括
Kernel32.dll 低层操作系统函数,例如管理内存和资源的函数。
User32.dll Windows 管理函数,例如负责消息处理、计时器、菜单和通讯的函数。
GDI32.dll 图形设备接口 (GDI) 库,包括负责设备输出的函数,例如负责绘图、显示上下文和字体管理的函数。

大部分 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 函数。

发布人:共享  
分享到:
点击次数:  更新时间:2005-08-16 11:23:51  【打印此页】  【关闭】
上一条:了解句柄  下一条:切换面板动态时钟的副作用



相关文章

  • • Access API函数分享
  • • Access VBA 注册表操作源码
  • • Access Excel VBA程序同时兼容32位和64位的解决办法
  • • 毫秒级和纳秒级计时的API--timeGetTime、GetTickCount、QueryPerformanceCounter
  • • 一种比GetTickCount 和Timer更精确的计时器
  • • VB用PrevInstance和DDE实现禁止多个实例同时打开并传递命令
  • • 获取版本号及判断是否运行版本
  • • API获取网卡地址

热门文章

  • [2005-08-16] Access获取Windows目录和System目录?access数据库
  • [2009-03-26] API函数详解(转载自红尘如烟)access数据库
  • [2005-08-16] Access获取网卡物理地址access数据库
  • [2004-11-23] 等待调用外部程序执行完毕access数据库
  • [2006-10-25] 如何用api检查任务栏中有多少种输入法access数据库
  • [2004-11-28] Access判断组合框是否处于下拉状态access数据库

热门产品

公司动态|在线留言|在线反馈|友情链接|会员中心|站内搜索|网站地图

中山市天鸣科技发展有限公司 版权所有 1999-2023 粤ICP备10043721号

QQ:18449932

Access应用 Access培训 Access开发 Access平台

access|数据库|access下载|access教程|access视频|access软件

Powered by MetInfo 5.3.12 ©2008-2025  www.metinfo.cn