中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > Oracle
在Oracle/2000中调用Windows API函数
作者:lemon 时间:2007-06-15 15:36 出处:ccidnet.com 责编:月夜寒箫
              摘要:在Oracle/2000中调用Windows API函数

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

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

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

1.初始化外部函数

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

(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包的说明(PackageSpefication)部分,输入这个PL/SQL子程序的原型。

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

 

  
              PACKAGEWinExecIS
              FUNCTIONWinExec(ExecfileINVARCHAR2,
              commandINPLS_INTEGER)
              RETURNPLS_INTEGER;
              END;/*在包说明部分,是模仿外部
              函数原型的PL/SQL函数原型说明*/
              PACKAGEBODYWinExecIS
              lh_USERora_ffi.libHandleType;/*定义库柄类型变量*/
              fh_WinExecora_ffi.funcHandleType;/*定义函数柄类型变量*/
              
              FUNCTIONi_WinExec(funcHandleINora_ffi.funcHandleType,
              ExecfileINOUTVARCHAR2,
              commandINPLS_INTEGER)
              RETURNPLS_INTEGER;
              
              PRAGMAINTERFACE(C,i_WinExec,11265);
              /*步骤2将一个PL/SQL子程序与外部函数相关联*/
              
              FUNCTIONWinExec(ExecfileINVARCHAR2,
              commandINPLS_INTEGER)
              RETURNPLS_INTEGER
              IS
              execfile_lVARCHAR2(512):=Execfile;
              rcPLS_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');
              EXCEPTIONWHENora_ffi.FFI_ERRORTHEN
              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*/
              
              ENDWinExec;

  

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

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

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有