关于在dll中调用WebService的问题,100分相赠

mantti 2009-02-05 03:41:41
各位好
最近写一个基于Webservice的客户端程序,ws也是用delphi写的,但在调用时出现了一些问题,请各位指教一下
delphi连接webservice自动生成的代码如下,我自己修改了下


..
IWebServiceAPI = interface(IInvokable)
..

function GetIWebServiceAPI(UseWSDL: Boolean; HTTPRIO: THTTPRIO): IWebServiceAPI;
var
RIO: THTTPRIO;
myIni: TiniFile;
cServer, defWSDL, defURL, defSvc, defPrt, Addr: string;
begin

myIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Param.ini');
cServer := myIni.ReadString('DataSource','Server','');
myIni.Free;

With HTTPRIO do
begin
defWSDL := cServer + RENT_SERVERWSDL;
defSvc := RENT_SERVERSERVICE;
defPrt := RENT_SERVERPORT;
defURL := cServer + RENT_SERVERSOAP;
end;

Result := nil;

if UseWSDL then
Addr := defWSDL
else
Addr := defURL;

if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
try
Result := (RIO as IWebServiceAPI);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;


现在有问题了,如果此单元直接放在exe里面调用的时候,一切正常,但是如果将该单元放在dll里面调用的时候,当debug到Result := (RIO as IWebServiceAPI);时就会出现Exception EIntfCastError的信息,导致dll不能正常工作
现在的情况是,最好也将该单元放在dll里面做成接口形式的,因为还有其他的dll需要调用它
我是不是忽略了什么,还是webservice本身就不能再dll里面调用
看网上说要加初始化什么的,我就加了下面这些,但是也不起作用
initialization
CoInitialize(nil);
finalization
CoUnInitialize;
...全文
308 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seamour 2009-02-06
  • 打赏
  • 举报
回复
as运算符调用的是System._AsClass,里面又用到了is运算符(调用_IsClass),又调用了TObject.InheritsFrom。看一下这里的代码就知道了,exe和dll的rtti位置是不一致的,而InheritsFrom采用了地址进行判断。所以,当对象是从dll传到主程序中,而在主程序中使用as运算符的时候,对象里类类型的指针实际指向dll中的rtti,而as后面的指针指向exe中的rtti,两者的地址不可能一样,自然就出错了
僵哥 2009-02-06
  • 打赏
  • 举报
回复
在自动生成的单元当中initialization域应该还有InvRegistry.RegisterInterface(TypeInfo(IWebServiceAPI), ***, ***);作为DLL的时候,应该放到DLL的DllEntry当中DLL_PROCESS_ATTACH当中去执行.
僵哥 2009-02-06
  • 打赏
  • 举报
回复
webservice的调用单元没必要做成独立的DLL,除非在其中进行某些封装.

出现EIntfCastError,估计是类型库注册失败,或者类型库管理器不唯一导致注册到的类型库管理器与实际使用的不一致.

mantti 2009-02-06
  • 打赏
  • 举报
回复
再顶
mantti 2009-02-06
  • 打赏
  • 举报
回复
再顶,相信csdn高手还是挺多的,为什么就没人知道这是为什么?
谁要是能帮解决,500分相赠,这个帖不够再开个帖
mantti 2009-02-06
  • 打赏
  • 举报
回复
感谢以上两位
Seamour请来 http://topic.csdn.net/u/20090206/13/047e2782-66d6-4a11-aff9-2d532d2470a3.html 200分
http://topic.csdn.net/u/20090206/13/b0ec8749-16df-4795-9395-bf67f64fea55.html 100分
mantti 2009-02-05
  • 打赏
  • 举报
回复
还没人,顶
顺便说一下,HTTPRIO是带进去的,不是动态创建的
mantti 2009-02-05
  • 打赏
  • 举报
回复
没人回答自己顶
liangpei2008 2009-02-05
  • 打赏
  • 举报
回复
帮顶,下班回家看!

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧