windowsapi函数:在Oracle/2000中调用Windows API函数

="t18"> OracleDeveloper/2000是Oracle微机开发工具由于它和Oracle数据库紧密连接比用PowerBuilder或其它高级语言采用ODBC和Oracle连接享有得天独厚优点越来越在Windows95和WindowsNT平台上得到广泛应用笔者在用其进行设计时感到既然是在Windows平台上开发假如能在其中应用些WindowsAPI将使Developer/2000有如虎添翼感觉可以大大弥补它和底层操作系统联系能力差、控制实时硬件设备功能差缺点开发出集成性更好应用 所有用第 3方语言编写对Developer/2000都称为外部WindowsAPI也是外部这些外部必须包含在个动态库中例如WINDOWS操作系统下动态链接库或UNIX系统下共享库等Developer/2000通过为每个外部产生个PL/SQL接口它使用PL/SQL语法接口就可以激活这外部个外部产生个PL/SQL接口需要用到内建软件Software包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子原型 下面是个完整为WindowsAPIwinexec建立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_(fh_WinExec,   ORA_FFI.C_INT);/*返回值注册原类型为BOOL*/      ENDWinExec;



   可以将多个外部PL/SQL接口放在个包内要在Developer/2000FormDesigner中使用这些外部只要把包含这库(.PLL)附加进来使用包名.名就可激活这个外部 例如:WinExec.WinExec('c:\windows\notepad.exe',0) 具体WindowsAPI数据类型和PL/SQL数据类型转换可参照Developer/2000中ProcedureBuilder帮助文件中对ORA_FFI软件Software包具体介绍

Tags:  oracle日期函数 oracle函数 vb调用windowsapi windowsapi函数

延伸阅读

最新评论

发表评论