Oralce 调用Delphi写DLL去访问C# WebService的问题

web|访问|问题

我想从Oracle的存储过程通过一个外部dll(Delphi编写)去访问C#写的WebService时,出现了“尚未调用 CoInitialize”
不知道是怎么回事,望各位指点一二。
1、我在Oracle里写了一个函数AddNumber如下:
CREATE OR REPLACE FUNCTION "MY"."ADD" (a in BINARY_INTEGER,b
in BINARY_INTEGER) RETURN BINARY_INTEGER AS
EXTERNAL LIBRARY MY_LIB
NAME "AddNumber"
LANGUAGE C;
2、写了一个过程AddTest如下:
CREATE OR REPLACE PROCEDURE "MY"."ADDTEST" (a in
BINARY_INTEGER,b in BINARY_INTEGER)
as
retVal BINARY_INTEGER;
begin
retVal:=Add(a,b);
end;
3、创建了MY_LIB包:
CREATE OR REPLACE LIBRARY MY_LIB AS 'C:\oracle\ora92\bin\MyWebservice.dll';
4、在Delphi里创建了一个MyWebservice.dll,并拷贝其到$ORACLE_HOME$\BIN目录下,其中有一个方法:
interface
function AddNumber(a:integer;b:integer):Integer;cdecl;
....
implementation
procedure DoGetWebServiceErr(ErrMsg:string);
var
logFile: TextFile;
i:integer;
begin
AssignFile(logFile,'d:\test.txt');
try
Rewrite(logFile);
Write(logFile,ErrMsg);
finally
CloseFile(logFile);
end;
end;
function AddNumber(a:integer;b:integer):Integer;
begin
try
Result := GetMyWebServiceSoap().AddNumber(a,b);
except
on E: Exception do DoGetWebServiceErr(E. E.Message);
else
Result :=-1;
end;
end;
.....
其中:GetMyWebServiceSoap()是我用WSDL Importer导入生成的MyWebService.pas中的一个方法。
我在该Dll的项目文件里导出了该方法:
exports
AddNumber;
5、用C#在Localhost创建了一个名为MyWebService的Web Service,其中有一个名为AddNumber的WEB方法,其定义如下:
[WebMethod]
public int AddNumber(int a,int b)
{
return a+b;
}
6、我用c#写了一个Windows Form客户端,通过调用上面用Delphi 写的dll,测试该Web方法,测试成功
[DllImport(DLLPath,EntryPoint = "MyWebservice.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private extern static int AddNumber(int a,int b);
......
///测试按钮
private void buttonTestWebService_Click(object sender, System.EventArgs e)
{
Consle.Write( AddNumber(1,2));
}
7、在SQL*Plus里测试失败,打开Test.txt文件内容为“尚未调用 CoInitialize”,测试代码如下
EXECUTE Addtest(1,1);
如果将Delphi中的AddNumber 修改为
function AddNumber(a:integer;b:integer):Integer;
begin
try
Result :=a+b;//不调用WebService,直接计算
except
on E: Exception do DoGetWebServiceErr(E. E.Message);
else
Result :=-1;
end;
end;
执行则成功。
Oracle的Listener.ora和tnsnames.ora的配置如下
# LISTENER.ORA Network Configuration File: C:\oracle\ora92\network\admin\listener.ora
# Generated by Oracle configuration tools.
MY_EXTPROC_LISTENER =

(ADDRESS_LIST =
(ADDRESS= (PROTOCOL=ipc)
(KEY = extproc)
)
)
SID_LIST_MY_EXTPROC_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = extproc)
(ORACLE_HOME = C:\oracle\ora92)
(PROGRAM= C:\oracle\ora92\bin\extproc)
(ENVS="EXTPROC_DLLS=ANY")
)
)
# TNSNAMES.ORA Network Configuration File: C:\oracle\ora92\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

EXTPROC_CONNECTION_DATA.WORLD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
(CONNECT_DATA =
(SID = extproc)
)
)

时间: 2024-12-02 14:04:45

Oralce 调用Delphi写DLL去访问C# WebService的问题的相关文章

com-C++ 如何调用Delphi的dll文件中的COM方法

问题描述 C++ 如何调用Delphi的dll文件中的COM方法 请问 C++ 如何 调用 Delphi 的dll文件中的COM方法 解决方案 只要是COM就遵守COM的规范,Delphi写出来的COM和其他语言写出来的COM用法是一样的

asp.net webservice调用Delphi的dll

问题描述 asp.net webservice调用Delphi的dll asp.net webservice调用Delphi的dll,执行方法Init(连接Oracle数据库),报错连接超时. 建立个winform程序,调用Init函数可通过,但webservice就是不行. 我是发布在服务器server 2003 32位, IIS发布,发程序发布的文件扔到IIS根目录,dll文件在bin目录下. 调用的这个dll文件又调用了另一个dll,2个dll文件都扔到bin目录下了.不知道是什么原因,w

winform-急,求大神帮帮忙,关于C#调用delphi的dll文件抛错问题

问题描述 急,求大神帮帮忙,关于C#调用delphi的dll文件抛错问题 [DllImport(_fileDll EntryPoint = ""JX102R_Read_Card"" CharSet = CharSet.Ansi CallingConvention = CallingConvention.StdCall)] public static extern int JX102R_Read_Card(ref int ReaderNo ref StringBuil

java调用delphi写的DLL报错误签名错

问题描述 如题,但并不是每次都报错,只是偶尔.函数参数我只有两个,都是字符串类型:Java这边我定义为string类型,delphi的dll里我定义为widestring类型错误显示为:错误签名AppName:javaw.exeAppVer:6.0.160.1ModName:adsloc32.dllModVer:5.60.0.0Offset:00030b00我写的delphidll里面调用了adsloc32.dll.补充:我用的开发工具是eclipse,delphi3写的DLL. 解决方案 解决

C#调用Delphi写的dll的问题。

问题描述 有这样一个Delphi原型接口.声明如下TArrayOfByte=arrayofByte;functionGetTemplateFromFile(imgPath:PAnsiChar;varATemplate:TArrayOfByte):Integer;stdcall;ATemplate这个参数是一组Byte数组,但这数组的大小是在接口即GetTemplateFromFile函数里分配的.通常情况下返回4096个字节.但我引用C#调用时,发现只返回一个字节.C#声明方式如下.[DllIm

C#调用Delphi的DLL问题

问题描述 Delphi编写的DLL中有一函数如下:functioncolad(a:integer;p_coladlist:Tlist):boolean;C#中应该怎样调用啊?请给个例子吧!

c#调用delphi的dll的方法

几个关键技术点: 1.C#要以非托管方式调用DLL: 2.C#把整理好的画图数据生成事先定义好格式的XML文件,传给DLL: 3.DLL解析XML文件,根据相应格式,要求,画图: 4.DLL输出GIF文件(经过比较GIF图像失真率小,且文件大小最小): 5.C#装载GIF文件,传到前台展示.   library Icdll; uses   SysUtils;      function Check22:Pchar;stdcall;    begin    result:='ok';    end

.net调用delphi 的DLL使用ADO 连接oracle出错 是怎么了,但是delphi调就没问题。 这个诡异的问题有人知道吗?

问题描述 如题,能够帮我解决这个问题,奖励1000大洋.求大家帮帮忙!! 解决方案 解决方案二:看你怎么掉滴,贴出对方的api和你的pinvoke声明.不过话说delphi滴人更喜欢用BDE引擎访问数据啊

.Net下如何跨语言调用Delphi写的报表引擎

我去年上半年之前一直使用的是Delphi,公司在这上面也积累了很多公共资源.在06年9月实现了一个 功能强大的报表引擎,公司到现在基本每个项目组都在使用它做报表.现在在.Net下,使用 OpenExpressApp,暂时也没有足够精力去重新开发一个报表引擎(OpenReport),所以就想到先重用以前 的报表引擎. 下面就介绍一下如何在WPF中使用Delphi下的功能. 封装Delphi引擎为一个OCX控件 之前的报表引擎是基于Delphi下的,在跨语言应用下,最容易想到的就是使用ActiveX