一个老版本的程序,在DCOM自动化对象的形式下(应用程序)使用正常,但最终要以COM+组件服务的(DLL)形式发布,但在COM+中运行时出现大部分原有功能正常,但只有一小部分功能,无法使用。执行过程中报告"DLLHOST异常“,然后组件崩亏!不知是什么原因,刚开始怀疑DLL下不能正常使用,最后将以前DCOM下的接口函数封装成DLL,然后测试使用正常,但将此DLL放在COM+,让COM+的接口函数实现部分,去调用此DLL。这样也会出现同样的问题。非常奇怪,不知为什么?有没有人遇过

解决方案 »

  1.   

    COM+属于无状态对象,所以如果你用了变量保存状态,下次调用时,状态会被清空,就可能出现异常,这也是动态链接库和COM+环境不一样的地方,查看一下代码吧。
      

  2.   

    我的DLL是在DELPHI下写的。导出的只有两个函数WaitTask()和RecvFax(),这两个函数又去调用了一个产家的SDK的API函数,实现了完成等待任务和接收传真的功能。
    DLL的代码就不列出了,下面是COM+服务的代码:
    unit Unit1;
    {$WARN SYMBOL_PLATFORM OFF}interfaceuses
      ActiveX, Mtsobj, Mtx, ComObj, DmComDll_TLB, StdVcl;
      function Dm_Open:integer; stdcall;external 'DmApiDll.dll' ;
      function Dm_Close:integer; stdcall;external 'DmApiDll.dll' ;
      function Dm_WaitTask(var chNo:integer):integer; stdcall;external 'DmApiDll.dll' ;
      function Dm_RecvFax(var chNo:integer):integer; stdcall;external 'DmApiDll.dll' ;type
      TFaxSvrDll = class(TMtsAutoObject, IFaxSvrDll)
      protected
        procedure Close; safecall;
        procedure Open; safecall;
        procedure RecvFax(chNo: Integer); safecall;
        procedure WaitTask(chNo: Integer); safecall;
        { Protected declarations }
      end;implementationuses ComServ;procedure TFaxSvrDll.Close;
    begin
       Dm_Close;
    end;procedure TFaxSvrDll.Open;
    begin
      Dm_Open;
    end;procedure TFaxSvrDll.RecvFax(chNo: Integer);
    begin
      RecvFax(chNo);
    end;procedure TFaxSvrDll.WaitCall(chNo: Integer);
    begin
      Dm_WaitTask(chNo);
    end;initialization
      TAutoObjectFactory.Create(ComServer, TFaxSvrDll, Class_FaxSvrDll,
        ciMultiInstance, tmApartment);
    end.请大家帮我查一下错误原因,里面没有保存状态的代码啊?
    错误提示是“Dllhost.exe应用程序错误”
      应用程序发生异常 unknown software exception(0xc00000fd),位置为0x01885227
      要终止程序,请单击“确定”
      要调试程序,请单击“取消”
    另外那位大侠知道通过这个地址找取错误代码。
      

  3.   

    多开几个Delphi调试一下吧:)
      

  4.   

    刚发现:
    procedure TFaxSvrDll.RecvFax(chNo: Integer);
    begin
      RecvFax(chNo);//应该是Dm_RecvFax(chNo)吧,呵呵,可能是笔误。
    end;一般我碰到抛出的异常都是“需要加载一个dll”之类的,像内存错误这麽严重的异常还没碰到过,如有可能,连'DmApiDll.dll' 一起调试一下吧。单单一个内存错误,看不出什么东东。
      

  5.   

    我已经发现问题原因,如果我采用“库应用程序”方式激活就没有这此现象一切正常,使用“服务器应用程序”方式激活时,就出现DllHost错误。但不知如何解决这个问题。如果这样的话就不支持远程访问了啊!