zoukankan      html  css  js  c++  java
  • DCOM到COM+

    一、原DCOM应用的结构:
    我用DELPHI IDE的向导正常生成一个远程数据模块(RdbDBSvr),并在其中放入AdoDataset,Adoquery等数据集控件,建立接口方法,对外 Export方法接口,为客户端提供数据查询功能,该服务器采用独立运行的进程外服务模式。客户端则利用Dcomconnection来连接此远程数据模 块。总之是一个在DELPHI中创建的标准的C/S应用程序。
    需要说明的是在设计RdbDBSvr时,为保持未来的代码重用,其中没有加入直接引用主窗体变量的引用,一些为了同 步线程设置的变量,我均将其放入了一个公用变量单元中。同时,同时我还尽量使用方法而不是直接使用Provider控件来为客户提供数据。事实证明,这种 设计减轻了DCOM向COM+对象转换的复杂程度,而且应该说是相当方便的。
    在客户端,我则通过公用变量引入远程数据模块的IAppServer接口,并在大部分的代码中引用这一公用变量并调用方法。也就是说,代码中没有加入对特定远程数据提供者的直接引用。
      二、现在我们对服务器进行转换。
      DCOM对象向COM+对象转换前,我事实上运用了一个事实:就是DELPHI中无论是RemoteDataMoudel还是 MTSDataMoudle,都实现了IAppServer接口,并归入Borland DataSnap Applacation server Catlog中。因此无论是MTS对象,不是DCOM对象,在使用DcomConnection控制找远程数据提供者(Remote data provider)时,都会在列表中出现。
    (一)   方法一
    1、用DELPHI IDE创建一个新的Transactional data moudle,并将其放入一个单独的ActiveX DLL中。
     
    2、打开原DCOM服务器中的远程数据模块,选择其中的全部控件,并将其拷贝到你新创建的MTS数据模块中,这样你原远程数据模块中所有控件的属性都被原样复制过来了。这一步是为下一步得用DCOM远程数据模块代码做了必要准备。

    3、打开Type library编辑器,将原DCOM服务器的类型库加入到引用列表中,并将新的MTS数据模块的Parent interface改成DCOM服务器中远程数据模块实现的接口。然后刷新类型库。






    4、此时你的MTS接口实现单元中,将会自动加入原DCOM远程数据模块的接口声明,并加入实现代码的框架。
     
      TDemo = class(TMtsDataModule, IDemo)
      private
        { Private declarations }
      protected
        class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
    //以下是我的原远程数据模块的接口表,DELPHI自动将其复制到此单元中,并且生成了代码框架
        procedure FindPersons(const Name, UnitNo: WideString;
          out RDataset: OleVariant); safecall;
        procedure GetFieldsName(const TBName: WideString; out FDNames: OleVariant);
          safecall;
        procedure GetLaborage(const PersonNo: WideString; out Records: OleVariant);
          safecall;
    procedure GetOtherInfo(const TableName, PersonNo: WideString;
    ……
      public
        { Public declarations }
      end;
    ……
    procedure TDemo.FindPersons(const Name, UnitNo: WideString;
      out RDataset: OleVariant);
    begin
     
    end;
    ……
    5、现在,返回到原DCOM远程数据模块的实现单元,将其方法的具体实现代码复制到此单元。并将复制代码中的原 DCOM对象的类名替换成MTS对象的类名。同时注意:如果原DOCM远程数据模块引用了公用单元(如我自己引用的公用变量单元),将你还需将引用的公用 单元加入到USER列表中。
    6、至此,你的与DCOM数据模块相同功能的MTS数据模块完全实现,请编译并注册该MTS对象。
    三、客户端:
    打开你的客户端应用程序源代码,并打开客户端数据模块中的DCOMConnection对象的ServerName 属性列表,此时,你将可以看到MTS对象出现在了列表中,选择它,并重新编译你的客户应用程序。如果你在客户端代码中没有加入对ServerName的引 用硬编码,则你将看到客户端不需任何改变就能够正常运行,而此时它引用的已不是DCOM对象而是运行在COM+环境中的MTS对象。为证实这一点,你可以 运行DCOMCNFG。在本地计算机中“正在运行的进程”列表中,你将看到MTS正在欢快的旋转。
    四、注意的问题:
    1、上述方法是将原DCOM   应用服务器的类型库导入到MTS服务器中,再实现类型库中的方法。因此,如果你将新生成的MTS服务器组件发布到其他计算机上,并且没有将原DCOM应用 服务器拷贝并注册到该计算机上,将你的客户端将会收到“找不到类型库”的错误提示。解决这一问题的办法是将原DCOM应用服务器的*.tlb文件复制到该 计算机上,并用tregsvr.exe –t (server).tlb 来在该计算机上注册类型库(server用你原服务器名代替)。另一种方法是,在编辑MTS对象类型库时,直接引用原服务器的TLB文件,而在分民MTS 对象将该TLB文件与MTS包随同分发。
    2、以上转换事实上只能对比较简单的DCOM对象进行。如果你的DCOM代码中加入了与后端数据库相关的事务支持代 码,则你必须修改其代码,使之使用MTS提供的事务管理功能,这样才能充分发挥MTS资源管理、事务协调的强大功能,当然,如果你的DCOM对象没有使用 与MTS相容的线程模型,则你的修改工作量将会更大。
    3、在转换成MTS对象后,你就能直接运用MTS基于角色的安全功能,对你的MTS的安全属性实施细微的控制,并且不用增加任何代码,当然如果你的代码中加入了原基于DCOM的特殊安全设定,你可能还要进行微调。但是,COM+会兼容这些安全代码。
    4、转换成MTS对象后,建议你重新确定你的COM默认发生的“最低安全限制”属性和你计算机的防火墙设置,以免它停止工作或“拒绝访问”。
  • 相关阅读:
    Spring整合SpringDataJpa配置文件头
    SpringDataJpa全部依赖
    Spring data jpa persistence .xml 配置文件
    最新为Phpstorm配置xdebug 进行断点调试
    如何根据不同的浏览器写不同的css样式达到兼容
    关于ecshop的那些故事
    安装xampp 后 发现 apache 启动不起来
    关于在biweb 中安装完成后 首页上方报错问题的解决
    phpstormn 中 xdebug 的详细配置2
    关于phpstorm中安装配置xdeug
  • 原文地址:https://www.cnblogs.com/jin20000/p/1376153.html
Copyright © 2011-2022 走看看