分享
 
 
 

在OracleDeveloper/2000中调用WindowsAPI函数

王朝oracle·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

作者:王 莹( 山 东 工 业 大 学 硕 士 研 究 生)

Oracle Developer/2000 是Oracle 的 微 机 开 发 工 具, 由 于 它 与Oracle 数 据 库 的 紧 密 连 接, 比 用Power Builder 或 其 它 高 级 语 言 采 用ODBC 与Oracle 的 连 接 享 有 得 天 独 厚 的 优 点, 越 来 越 在Windows95 和WindowsNT 平 台 上 得 到 广 泛 应 用, 笔 者 在 用 其 进 行 程 序 设 计 时 感 到, 既 然 是 在Windows 平 台 上 开 发 程 序, 如 果 能 在 其 中 应 用 一 些Windows API 函 数, 将 使Developer/2000 有 如 虎 添 翼 的 感 觉, 可 以 大 大 弥 补 它 与 底 层 操 作 系 统 的 联 系 能 力 差、 控 制 实 时 硬 件 设 备 功 能 差 的 缺 点, 开 发 出 集 成 性 更 好 的 应 用 程 序。

---- 所 有 用 第 三 方 语 言 编 写 的 子 程 序 对Developer/2000 都 称 为 外 部 函 数,Windows API 函 数 也 是 外 部 函 数。 这 些 外 部 函 数 必 须 包 含 在 一 个 动 态 库 中。 例 如WINDOWS 操 作 系 统 下 的 动 态 链 接 库 或UNIX 系 统 下 的 共 享 库 等。Developer/2000 通 过 为 每 一 个 外 部 函 数 产 生 一 个PL/SQL 接 口, 它 使 用PL/SQL 的 语 法, 在 程 序 中 调 用 这 一 接 口 程 序 就 可 以 激 活 这 一 外 部 函 数。

---- 对 一 个 外 部 函 数 产 生 一 个PL/SQL 接 口, 需 要 用 到 内 建 软 件 包ORA-FFI, 它 包 含 一 些PL/SQL 的 子 程 序 用 来 对 外 部 函 数 生 成PL/SQL 接 口, 实 际 操 作 时 可 以 用Procedure Builder 产 生 一 个 程 序 库, 在 程 序 库 中 建 立 一 个 程 序 包(Package), 在 这 个 包 中 实 现 对 外 部 函 数 建 立 连 接。 下 面 介 绍 这 一 过 程 的 具 体 步 骤:

---- 1. 初 始 化 外 部 函 数

---- 就 是 说 明 包 含 外 部 函 数 的 动 态 链 接 库 的 位 置, 并 从 中 分 离 出 外 部 函 数 的 原 型, 并 将 外 部 函 数 中 主 语 言 的 数 据 类 型 和PL/SQL 数 据 类 型 做 一 一 对 应 的 匹 配。 这 是 在 包 体(Package Body) 中 进 行 的。 具 体 分 以 下 几 步:

---- (1) 用OQA_FFI.LOAD_LIBRARY 得 到 包 含 外 部 函 数 的 动 态 链 接 库 的 库 柄, 此 时 需 提 供 动 态 链 接 库 的 名 字 和 位 置。

---- (2) 用ORA_FFI.REGISTER_FUNCTION 得 到 外 部 函 数 的 函 数 柄, 这 时 需 提 供 动 态 链 接 库 的 库 柄 和 外 部 函 数 名。

---- (3) 用ORA_FFI.REGISTER_PARAMETER 来 注 册 外 部 函 数 的 参 数 类 型, 对 每 一 个 参 数 都 要 提 供 它 的 外 部 函 数 柄 和 相 应 的PL/SQL 数 据 类 型。 参 数 注 册 的 顺 序 必 须 与 它 们 出 现 在 外 部 函 数 原 型 中 的 顺 序 一 致。

---- (4) 用ORA_FFI.REGISTER_RETURN 来 注 册 外 部 函 数 的 返 回 值 类 型, 这 时 需 要 提 供 它 的 外 部 函 数 柄 和 相 应 的PL/SQL 数 据 类 型。

---- 2. 将 外 部 函 数 和 一 个PL/SQL 子 程 序 相 关 联

---- 一 个 和 外 部 函 数 建 立 关 联 的PL/SQL 子 程 序, 实 际 上 指 明 了 外 部 函 数 的 内 存 地 址, 每 次 调 用 这 个 子 程 序, 实 际 上 是 调 用 与 它 相 对 应 的 外 部 函 数。 具 体 步 骤 为:

---- (1) 用ORA_FFI.FIND_FUNCTION 或ORA_FFI.REGISTER_FUNCTION 得 到 一 个 函 数 柄。

---- (2) 在PL/SQL 包 体 的 声 明 部 分, 定 义 一 个PL/SQL 子 程 序, 它 的 第 一 个 参 数 是 类 型 为ORA_FFI.FUNCHANDLETYPE, 接 下 来 是 依 次 对 应 外 部 函 数 参 数 的PL/SQL 数 据 类 型 的 参 数。

---- (3) 在 这 个PL/SQL 子 程 序 中 加 入 一 个PRAGMA 接 口。 PRAGMA 声 明 就 是 通 过 将 控 制 转 到 一 个 内 存 地 址, 来 激 活 这 个 外 部 函 数。

---- 3. 生 成 一 个 模 仿 外 部 函 数 的 原 型 的PL/SQL 子 程 序。

---- 这 个 子 程 序 就 是 用 户 可 见 的 外 部 函 数 的PL/SQL 接 口, 用 户 按 照 它 的 参 数 类 型 和 返 回 值 类 型 来 使 用 外 部 函 数, 具 体 步 骤 为:

---- (1) 在 包 体 的 声 明 部 分, 定 义 一 个PL/SQL 子 程 序, 它 的 参 数 和 返 回 值 是 和 外 部 函 数 对 应 的PL/SQL 类 型。 这 就 是 模 仿 外 部 函 数 原 型 的 一 个 子 程 序。

---- (2) 在 这 个 子 程 序 中 调 用 与 上 步 生 成 的 与 外 部 函 数 相 关 联 的PL/SQL 子 程 序。

---- (3) 在PL/SQL 包 的 说 明(Package Spefication) 部 分, 输 入 这 个PL/SQL 子 程 序 的 原 型。

---- 下 面 是 一 个 完 整 的 为Windows API 函 数winexec 建 立PL/SQL 接 口 的 例 子:

PACKAGE WinExec IS

FUNCTION WinExec(Execfile IN VARCHAR2,

command IN PLS_INTEGER)

RETURN PLS_INTEGER;

END; /*在包说明部分,是模仿外部

函数原型的PL/SQL函数原型说明*/

PACKAGE BODY WinExec IS

lh_USER ora_ffi.libHandleType; /*定义库柄类型变量*/

fh_WinExec ora_ffi.funcHandleType; /*定义函数柄类型变量*/

FUNCTION i_WinExec(funcHandle IN ora_ffi.funcHandleType,

Execfile IN OUT VARCHAR2,

command IN PLS_INTEGER)

RETURN PLS_INTEGER;

PRAGMA INTERFACE(C,i_WinExec,11265);

/*步骤2将一个PL/SQL子程序与外部函数相关联*/

FUNCTION WinExec(Execfile IN VARCHAR2,

command IN PLS_INTEGER)

RETURN PLS_INTEGER

IS

execfile_l VARCHAR2(512) := Execfile;

rc PLS_INTEGER;

BEGIN

rc := i_WinExec(fh_WinExec,

execfile_l,

command);

RETURN (rc);

END ;

/*步骤3中PL/SQL模仿函数的定义,

它实际上就是调用步骤2中与外部函数建立关联的那个函数*/

BEGIN

BEGIN

lh_USER := ora_ffi.find_library('Kernel32.dll');

EXCEPTION WHEN ora_ffi.FFI_ERROR THEN

lh_USER := ora_ffi.load_library(NULL,'kernel32.dll');

END ; /*得到动态链接库的库柄*/

fh_WinExec := ora_ffi.register_function

(lh_USER,'WinExec', ora_ffi.PASCAL_STD);

/*得到外部函数的函数柄*/

ora_ffi.register_parameter(fh_WinExec,

ORA_FFI.C_CHAR_PTR); /*参数注册,原类型为LPCSTR */

ora_ffi.register_parameter(fh_WinExec,

ORA_FFI.C_INT); /*参数注册,原类型为UINT */

ora_ffi.register_return(fh_WinExec,

ORA_FFI.C_INT); /*返回值注册,原类型为BOOL */

END WinExec;

---- 可 以 将 多 个 外 部 函 数 的PL/SQL 接 口 放 在 一 个 包 内。 要 在Developer/2000 的Form Designer 中 使 用 这 些 外 部 函 数, 只 要 把 包 含 这 一 程 序 包 的 程 序 库(.PLL) 附 加 进 来, 使 用 包 名. 函 数 名 就 可 激 活 这 个 外 部 函 数。

---- 例 如:WinExec.WinExec('c:\windows\notepad.exe', 0)

---- 具 体Windows API 函 数 数 据 类 型 和PL/SQL 数 据 类 型 的 转 换 可 参 照 Developer/2000 中Procedure Builder 帮 助 文 件 中 对ORA_FFI 软 件 包 的 详 细 介 绍。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有