Database 版 (精华区)
发信人: wodeji (西西), 信区: Database
标 题: [转载] PowerBuilder 开 发 系 列 谈 (2)
发信站: 紫 丁 香 (Tue Sep 29 17:49:31 1998), 站内信件
【 以下文字转载自 Programming 讨论区 】
【 原文由 two 所发表 】
---- 许 多 熟 练 使 用C 的 程 序 员 在 使 用PowerBuilder 时 都 希 望 自 己 以 前 在C 上
做 的 工 作 可 以 被P owerBuilder 引 用, 这 是 完 全 可 以 的。 在PowerBuilder 中 你 可
以 通 过 外 部 引 用 函 数 的 形 式 来 调 用 动 态 连 接 库 中 的 函 数。
----
PowerBuilder 调 用DLL 程 序 使 用 规 则
----PowerBuilder 可 以 支 持 任 何 一 种 非PowerScript 编 写, 并 存 储 在 动 态 链 接 库
中 的 外 部 函 数 或 过 程 的 调 用。 但 外 部 函 数 的 参 数 必 须 是 符 合Pascal 规 则
的( 即 参 数 压 栈 顺 序 从 前 至 后)。
---- 在 函 数 调 用 前, 因 先 作 函 数 声 明,PowerBuilder 支 持 以 下 两 种 外 部 函 数 类
型:
---- · 全 局 函 数: 可 以 在 应 用 的 任 意 位 置 调 用;
---- · 局 部 外 部 函 数: 在window,menu,user object 或 用 户 自 定 义 函 数 等 对 象 中
定 义。
---- 外 部 函 数 声 明 的 语 法 是:
----{Access}FUNCTION ReturnDataType Function-Name({REF}{DataTypel Arg1,...,Data
TypeN ArgN})LIBRARY LibName
---- 外 部 过 程 声 明 的 语 法 是:
----{Access}SUBROUTION Subroutine({REF}{DataType1 Arg1,...,DataTypeN ArgN})
---- 如 果 您 使 用 的 是 局 部 外 部 函 数 的 声 明, 您 还 可 以 指 定 对 象 的 访 问 权
限:Public,Private, Protected。 对 局 部 函 数 权 限 访 问 的 限 制 同 对 对 象 的 实 例 变
量 的 限 制 相 同。 您 可 以 指 定 对 象 名 加 函 数 名 的 方 式 调 用 外 部 函 数:
----object.function(arguments)
---- 如 在window 的w_emp 上 调 用 局 部 外 部 函 数Recog(), 就 可 这 样 使 用:
----w_emp.Recog()
----
如 何 在PowerBuilder 与DLL 之 间 传 递 参 数
---- 在PowerBuilder 的script 中 调 用DLL 中 的 函 数, 缺 省 情 况 下 是 通 过 传 值 法 来
传 递 参 数(pa ssed by value), 也 就 是 说PowerBuilder 将 对 要 传 递 的 参 数 做 一 份 拷
贝, 然 后 通 过 堆 栈 将 这 份 拷 贝 传 递 给 函 数。 如 果 你 希 望DLL 中 的 函 数 可
以 改 变 调 用 参 数 的 原 值, 就 可 以 通 过 参 考 传 值 法 (passed by reference) 来 传 递
参 数, 即 在 参 数 类 型 前 面 加REF 关 键 字 来 声 明 该 参 数 将 要 用 参 考 传 值
法。
---- 在 使 用DLL 时 有 一 些 基 本 规 则
---- 在MS Windows 中, 一 个DLL 在 被 装 入 内 存 后, 只 会 有 一 个 实 例, 不 会 因 为
多 个 程 序 使 用 同 一 个DLL 而 在 内 存 中 产 生 多 个DLL 拷 贝。 每 个DLL 只 有 一
个 最 大 为64K 的 数 据 段。 缺 省 情 况 下,Po werBuilder 都 是 使 用 传 值 法 来 传 递
参 数。 当 你 在 函 数 应 用 说 明 时 使 用 了REF 关 键 字,PowerBu ilder 将 传 递 一
个32 位 的 地 址 指 针( 段 地 址+ 偏 移 量) 给 被 调 用 的 函 数, 而 不 是 只 传 递 偏 移
量, 这 才 能 保 证DLL 中 的 函 数 能 得 到PowerBuilder 中 数 据 的 正 确 地 址。
在PowerBuilder 中 使 用 的 数 据 类 型 与C 语 言 支 持 的 数 据 类 型 不 尽 相 同,C 中
不 支 持 的 数 据 类 型 应 在 调 用 前 先 进 行 转 换。
---- 对 于 结 构, 要 在C 和PowerBuilder 中 做 相 等 的 说 明。
----PowerBuilder 不 支 持 函 数 指 针 的 传 递, 因 此 在PowerBuilder 中 不 能 使 用 回 调
函 数(callb ack funcion)。 如 果DLL 的 参 数 需 要 空 指 针(NULL), 你 可 以 向 函 数 传
递 一 个 值 为0 的 长 整 型。
----Windows 中 使 用 的 有 些 数 据 类 型C 中 并 不 支 持, 但 一 般 在C 的 预 编 译 器
中 用TYPEDEF 作 预 定 义, 同 时PowerBuilder 接 口 也 应 当 作 适 当 转 换。
----
使 用DLL 的 常 见 错 误 和 需 要 注 意 的 地 方
----1. 导 致 保 护 性 错(general protection fault)
---- 在Windows 中, 如 果 你 企 图 访 问 不 是 属 于 你 的 应 用 程 序 的 内 存 将 导 致
保 护 性 错。 导 致 保 护 性 错 的 原 因 可 能 有 以 下 几 点:
----a. 向DLL 中 的 函 数 传 递 了 不 正 确 的 参 数。 这 种 错 误 是 比 较 难 调 试 的,
因 为PowerBuilder 的 调 试 器 不 能 跟 踪 到C 程 序 中。 你 可 以 通 过 在C 中 使
用MessageBox 函 数 显 示 调 用 参 数 的 方 法 来 检 查 参 数 传 递 的 正 确 性。 更 全
面 的 方 法 是 使 用Windows 的 调 试 版 本( 带 有 调 试 信 息 的Windows 环 境) 和 功
能 更 强 的 调 试 器(Soft-ice for windows 或CodeView 等);
----b.C 中 对 数 组 的 访 问 超 出 了PowerBuilder 中 申 请 的 边 界。 在C 中 是 不 作 数
组 边 界 检 查 的, 这 可 能 是 导 致 保 护 性 错 的 最 常 见 的 原 因;
----c. 使 用 了 已 经 释 放 的 内 存 指 针。 你 最 好 把 已 经 释 放 的 内 存 指 针 置
为NULL, 以 便 在 使 用 前 进 行 判 断。
----2. 使 用 远 指 针
---- 在C 中, 所 有 的 静 态 变 量 和 全 局 变 量 都 是 在 程 序 的 数 据 堆 中 分 配 的,
其 他 变 量 都 是 在 栈 中 分 配 的。DLL 可 以 有 自 己 的 数 据 段, 但 是 它 没 有 堆
栈 段, 使 用 的 是 调 用 程 序 的 堆 栈。 这 就 意 味 着 寄 存 器DS 指 向 的 是DLL 数
据 段,SS 指 向PowerBuilder 应 用 程 序 的 堆 栈。 而 一 般 的Windows 应 用 程 序 中,DS
和SS 是 相 同 的, 你 可 以 使 用 近 指 针, 但 在 调 用DLL 中 引 用 远 堆 的 变 量 必 须
使 用32 位 的 远 指 针。 如 果 使 用 任 何 与 内 存 寻 址 有 关 的C 函 数, 都 要 使 用C
中 的far 版 本。 例 如 字 符 串 拷 贝 函 数, 应 该 用_fstrcpy 而 不 要 用strcpy。
----3. 注 意 静 态 变 量 的 使 用
---- 无 论 有 多 少 实 例 调 用 同 一 个DLL, 在 内 存 中 只 有 一 份DLL 代 码。 由
于Windows 是 多 任 务 的 环 境, 因 此DLL 中 的 静 态 变 量 可 能 由 于 其 他 实 例 对
此DLL 的 调 用 而 改 变。
----4. 不 要 试 图 共 享 文 件 句 柄
---- 在Windows 环 境 下, 不 可 能 在 应 用 程 序 和DLL 间 共 享 文 件 句 柄。 每 个 应
用 有 各 自 的 文 件 句 柄 表, 如 果 两 个 应 用 通 过 一 个DLL 来 访 问 同 一 个 文 件,
它 们 必 须 分 别 打 开 这 个 文 件。
----5. 及 时 释 放 使 用 过 的 资 源
---- 如 果 你 的DLL 中 使 用 了GDI 对 象, 一 定 要 及 时 释 放 它 们, 否 则 会
使Windows 因 申 请GDI 资 源 失 败 而 死 机; 例 如 你 建 立 了 一 个 逻 辑 字 体 或 逻
辑 笔, 在 使 用 完 后, 要 用DeleteObject 来 删 除 它。
----6. 为 使PowerBuilder 应 用 在Windows 环 境 下 正 常 运 行,DLL 应 放 在 下 列 目 录
之 中:
当 前 目 录
目 录
Windows System 目 录
在DOS 的 路 径 中 包 括 的 目 录
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.97.236.132]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: whs.hit.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: cadcam.hit.edu.c]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.527毫秒