在VB 中调用动态连接库

2008-02-23 06:59:02来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

---- 作 为 一 种 简 单 易 用 的Windows 开 发 环 境,Visual Basic 从 一 推 出 就 受 到 了 广 大 编 程 人 员 的 欢 迎。 它 使 程 序 员 不 必 再 直 接 面 对 纷 繁 复 杂 的Windows 消 息, 而 可 以 将 精 力 主 要 集 中 在 程 序 功 能 的 实 现 上, 大 大 提 高 了 编 程 效 率。 但 凡 事 有 利 必 有 弊。VB 中 高 度 的 封 装 和 模 块 化 减 轻 了 编 程 者 的 负 担, 同 时 也 使 开 发 人 员 失 去 了 许 多 访 问 低 层API 函 数 和 直 接 与Windows 交 互 的 机 会。 因 此, 相 比 而 言,VB 应 用 程 序 的 执 行 效 率 和 功 能 比C/C 或Delphi 生 成 的 程 序 要 差。 为 了 解 决 这 个 问 题, 在 一 个 大 型 的VB 开 发 应 用 中, 直 接 调 用Windows API 函 数 几 乎 是 不 可 避 免 的; 同 时, 还 有 可 能 需 要 程 序 员 自 己 用C/C 等 开 发 一 些 动 态 连 接 库, 用 于 在VB 中 调 用。 本 文 主 要 讨 论 在32 位 开 发 环 境Visual Basic 5.0 中 直 接 调 用Windows 95 API 函 数 或 用 户 生 成 的32 位 动 态 连 接 库 的 方 法 与 规 则。

---- Windows 动 态 连 接 库 是 包 含 数 据 和 函 数 的 模 块, 可 以 被 其 它 可 执 行 文 件(EXE、DLL、OCX 等) 调 用。 动 态 连 接 库 包 含 两 种 函 数: 输 出(exported) 函 数 和 内 部(internal) 函 数。 输 出 函 数 可 以 被 其 它 模 块 调 用, 而 内 部 函 数 则 只 能 在 动 态 连 接 库 内 部 使 用。 尽 管 动 态 连 接 库 也 能 输 出 数 据, 但 实 际 上 它 的 数 据 通 常 是 只 在 内 部 使 用 的。 使 用 动 态 连 接 库 的 优 点 是 显 而 易 见 的。 将 应 用 程 序 的 一 部 分 功 能 提 取 出 来 做 成 动 态 连 接 库, 不 但 减 小 了 主 应 用 程 序 的 大 小, 提 高 了 程 序 运 行 效 率, 还 使 它 更 加 易 于 升 级。 多 个 应 用 程 序 共 享 一 个 动 态 连 接 库 还 能 有 效 地 节 省 系 统 资 源。 正 因 为 如 此, 在Windows 系 统 中, 动 态 连 接 库 得 到 了 大 量 的 使 用。

---- 一 般 来 说, 动 态 连 接 库 都 是 以DLL 为 扩 展 名 的 文 件, 如Kernel32.dll 、commdlg.dll 等。 但 也 有 例 外, 如16 位Windows 的 核 心 部 件 之 一GDI.exe 其 实 也 是 一 个 动 态 库。 编 写 动 态 连 接 库 的 工 具 很 多, 如Visual C 、Borland C 、Delphi 等, 具 体 方 法 可 以 参 见 相 关 文 档。 下 面 只 以Visual C 5.0 为 例, 介 绍 一 下 开 发 应 用 于Visual Basic 5.0 的 动 态 连 接 库 时 应 注 意 的 问 题( 本 文 中 所 有 涉 及C/C 语 言 或 编 译 环 境 的 地 方, 都 以VC5 为 例; 所 有 涉 及Visual Basic 的 地 方 都 以VB5 为 例)。

---- 作 为 一 种32 位Windows 应 用 程 序 的 开 发 工 具,VB5 生 成 的exe 文 件 自 然 也 都 是32 位 的, 通 常 情 况 下 也 只 能 调 用32 位 的 动 态 连 接 库。 但 是, 并 不 是 所 有 的32 位 动 态 库 都 能 被VB 生 成 的exe 文 件 正 确 地 识 别。 一 般 来 说, 自 己 编 写 用 于VB 应 用 程 序 调 用 的 动 态 连 接 库 时, 应 注 意 以 下 几 个 方 面 的 问 题:

---- 1、 生 成 动 态 库 时 要 使 用__stdcall 调 用 约 定, 而 不 能 使 用 缺 省 的__cdecl 调 用 约 定;__stdcall 约 定 通 常 用 于32 位API 函 数 的 调 用。

---- 2、 在VC5 中 的 定 义 文 件(.def) 中, 必 须 列 出 输 出 函 数 的 函 数 名, 以 强 制VC5 系 统 将 输 出 函 数 的 装 饰 名(decorated name) 改 成 普 通 函 数 名; 所 谓 装 饰 名 是VC 的 编 译 器 在 编 译 过 程 中 生 成 的 输 出 函 数 名, 它 包 含 了 用 户 定 义 的 函 数 名、 函 数 参 数 及 函 数 所 在 的 类 等 多 方 面 的 信 息。 由 于 在VC5 中 定 义 文 件 不 是 必 需 的, 因 此 工 程 不 包 含 定 义 文 件 时VC5 就 按 自 己 的 约 定 将 用 户 定 义 的 输 出 函 数 名 修 改 成 装 饰 名 后 放 到 输 出 函 数 列 表 中, 这 样 的 输 出 函 数 在VB 生 成 的 应 用 程 序 中 是 不 能 正 确 调 用 的( 除 非 声 明 时 使 用Alias 子 句)。 因 此 需 要 增 加 一 个.def 文 件, 其 中 列 出 用 户 需 要 的 函 数 名, 以 强 制VC5 不 按 装 饰 名 进 行 输 出。

---- 3、VC5 中 的 编 译 选 项" 结 构 成 员 对 齐 方 式(structure member alignment)" 应 设 成4 字 节, 其 原 因 将 在 后 文 详 细 介 绍。

---- 4、 由 于 在C 中 整 型 变 量 是4 个 字 节, 而VB 中 的 整 型 变 量 依 然 只 有2 个 字 节, 因 此 在C 中 声 明 的 整 型(int) 变 量 在VB 中 调 用 时 要 声 明 为 长 整 型(long), 而C 中 的 短 整 型(short) 在VB 中 则 要 声 明 成 整 型(integer); 下 表 针 对 最 常 用 的 C 语 言 数 据 类 型 列 出 了 与 之 等 价 的 Visual Basic 类 型( 用 于 32 位 版 本 的 Windows)。

---- C 语 言 数 据 类 型 在Visual Basic 中 声 明 为 调 用 时 使 用 的 表 达 式

---- ATOM ByVal variable As Integer 结 果 为Integer 类 型 的 表 达 式

---- BOOL ByVal variable As Long 结 果 为 Long 类 型 的 表 达 式

---- BYTE ByVal variable As Byte 结 果 为 Byte 类 型 的 表 达 式

---- CHAR ByVal variable As Byte 结 果 为 Byte 类 型 的 表 达 式

---- COLORREF ByVal variable As Long 结 果 为 Long 类 型 的 表 达 式

---- DWORD ByVal variable As Long 结 果 为 Long 类 型 的 表 达 式

---- HWND, HDC, HMENU ByVal variable As Long 结 果 为 Long 类 型 的 表 达 式 等Windows 句 柄

---- INT, UINT ByVal variable As Long 结 果 为 Long 类 型 的 表 达 式

---- LONG ByVal variable As Long 结 果 为 Long 类 型 的 表 达 式

---- LPARAM ByVal variable As Long 结 果 为 Long 类 型 的 表 达 式

---- LPDWORD variable As Long 结 果 为 Long 类 型 的 表 达 式

---- LPINT, LPUINT variable As Long 结 果 为 Long 类 型 的 表 达 式

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:如何用TextBox打开和保存文件

下一篇:一组VB实用小程序