- Oracle如何直接调用dll接口
- dll如何和Windows窗体进行消息交互
- Oracle通过comwrap调用COM接口
那么就先来说说第一个问题。
首先是功能需求,一个ATL写的dll,由Oracle调用。
问题分析,VC写一个dll,这个现在已经不是问题;Oracle调用dll,这个是在网上找到的一些资料,然后实现的。
具体实现
- VC写的一个dll
CPP文件如下:#include
#include int __stdcall DllMain(HANDLE, DWORD, LPVOID)
{
return 1;
} short SendSmsMessage2DB(BSTR mobile_no, BSTR text)
{
char moblie_no[11] = {0};
char text[256] = {0};
char buf[512] = {0};strcpy(mobile_no, _com_util::ConvertBSTRToString(mobile_no));
strcpy(text, _com_util::ConvertBSTRToString(text));sprintf(buf,
"echo oracle call dll, params is mobile_no = %s, text = %s >> e:/log.txt", mobile_no, text);system(buf);
return 0;
}Def文件如下:
LIBRARY "SendMessage.dll"
EXPORTS
SendSmsMessage2DB @1OK,最简单的一个示意工程就要这两个文件就OK了,现在编译成dll.
- Oracle调用dll
listener.ora中修改类似下面
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = d:/oracle/product/10.1.0/Db_2)
(ENVS = "EXTPROC_DLLS=ANY")
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = vscpmast)
(SID_NAME = vscpmast)
)
)
主要是添加ENVS = "EXTPROC_DLLS=ANY"这句,这样就可以调用外部存储过程了。
---------------------------------------------------------------------------------------------------
将刚才生成的dll拷贝到BIN或者LIB目录下(据说9i以后就要放在这里,我试验过,放在其他地方会在后面编译oracle的PL/SQL的时候出错)
-----------------------------------------------------------------------------------------------------create Lib
drop library oracle_sendMessage;
create or replace library oracle_sendMessage
as 'd:oracleproduct.1.0Db_2BINSendMessage.dll'; --create function
create or replace function SendSmsMessage(mobileno in varchar2, text in varchar2)
return binary_integer
as
external
library oracle_sendMessage
name "SendSmsMessage2DB"
language c
parameters (
mobileno string,
text string,
return short
);--------------------------------------------------------------
在SQL*PLUS中测试--test oracle call dll
declare temp number(10);
begin
select SendSmsMessage('123', 'test') into temp from dual;
dbms_output.put_line(temp);
end;
/--------------------------------------------------------------
OK,到这里我们就可以在E盘下找到log.txt这个文件,查看测试是否成功了^^。