- 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 @ 1 - 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这个文件,查看测试是否成功了^^。