各位好
最近写一个基于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;

解决方案 »

  1.   

    还没人,顶
    顺便说一下,HTTPRIO是带进去的,不是动态创建的
      

  2.   

    再顶,相信csdn高手还是挺多的,为什么就没人知道这是为什么?
    谁要是能帮解决,500分相赠,这个帖不够再开个帖
      

  3.   

    webservice的调用单元没必要做成独立的DLL,除非在其中进行某些封装.出现EIntfCastError,估计是类型库注册失败,或者类型库管理器不唯一导致注册到的类型库管理器与实际使用的不一致.
      

  4.   

    在自动生成的单元当中initialization域应该还有InvRegistry.RegisterInterface(TypeInfo(IWebServiceAPI), ***, ***);作为DLL的时候,应该放到DLL的DllEntry当中DLL_PROCESS_ATTACH当中去执行.
      

  5.   

    as运算符调用的是System._AsClass,里面又用到了is运算符(调用_IsClass),又调用了TObject.InheritsFrom。看一下这里的代码就知道了,exe和dll的rtti位置是不一致的,而InheritsFrom采用了地址进行判断。所以,当对象是从dll传到主程序中,而在主程序中使用as运算符的时候,对象里类类型的指针实际指向dll中的rtti,而as后面的指针指向exe中的rtti,两者的地址不可能一样,自然就出错了
      

  6.   

    感谢以上两位
    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分