还有几个问题:
2.midas不是说需要有个dbclient.dll支持吗,但我怎么找不到这个文件
3.什么是回调
4.delphi的虚拟方法表VMT是怎么回事,
VMT是一个张表还是每个对象一张表,VMT中包含了那些内容,大概是如何工作的
5.
怎么样把指针的内容显示出来
怎么将pchar转换成string,请简单写一下代码。谢谢(回答任何一个问题都有分)

解决方案 »

  1.   

    你问得可真多呵, 你在看 MIDAS 原码? 下面的说明引用代码用的是 delphi7, 以前版本差不多,可能所在行有所不同.IAppServer 是 MIDAS 的核心接口
      也可以说是一个公共接口, 要在服务器和客户机都实现, 服务器这边由 TRemoteDataModule 实现的(你的父类), 客户机部分内部机制无法确定,这些是未公开原码的,服务器部份就那几句,TRemoteDataModule 一共才几行,关键在 IProviderSupport 和 DataSetProvider 这一个接口和一个控件中。看这句:
    TRemoteDataModule = class(TDataModule, IAppServer) 
    看得出来 TRemoteDataModule 跟 TDataModule 没有什么重大区别, 关键在重实现 IAppServer部份原码
    客户机这部分实现在 MIDAS.dll 里(d4 以前版本叫 DBClient.dll, 这是第二个问题).IProvider 仍是d4 以前版本的兼容产物, 在那时代放在 RDM 上的Query是要 export provider to datamodule 的(不像现在的 DataSetProvider),而导出的接口就是 IProvider.Idatabroker 我不知道, 你告诉我在哪个单元中的? 我得去看看.IProviderSupport 呵, 这才是 MIDAS 使用到的最重要的一个接口, 虽然它不是核心, 实际上也得简单. 
    IProviderSupport 定义在 db.pas 1715 行, 你得看看它的方法, 不明白没事, 知道有这些方法就可以我们看 TDataSet 哈
    TDataSet = class(TComponent, IProviderSupport) // db.pas 1786
    原来对 IProviderSupport 的实现就是 TDataSet,而不是 Borland 一惯的 TProviderSupport
    再向下100 行左右(可怕,全是TDataSet声明)
    { IProviderSupport } //db.pas 1881 行
    原来 IProviderSupport 中的方法全被 TDataSet 声明成了 virtual, 也就是说真正的数据引擎相关数据集控件都要继承并实现这些 virtual 方法是不是上面这么一回事?看看 ADOQuery
    TADOQuery = class(TCustomADODataSet) // ADODB.pas 938 行
    原来所有的ADO控件都是 TCustomADODataSet 子类, 好,那看 TCustomADODataSet
    TCustomADODataSet = class(TDataSet, IUnknown, RecordsetEventsVt) //ADODB.pas 530行
    ...
        { IProviderSupport } // 629 行
        procedure PSEndTransaction(Commit: Boolean); override;
        procedure PSExecute; override;
        function PSExecuteStatement(const ASQL: string; AParams: TParams;
          ResultSet: Pointer = nil): Integer; override;
        procedure PSGetAttributes(List: TList); override;
        function PSGetDefaultOrder: TIndexDef; override;
        function PSGetKeyFields: string; override;
        function PSGetParams: TParams; override;
        function PSGetQuoteChar: string; override;
        function PSGetTableName: string; override;
        function PSGetIndexDefs(IndexTypes: TIndexOptions = [ixPrimary..ixNonMaintained]): TIndexDefs; override;
        function PSGetUpdateException(E: Exception; Prev: EUpdateError): EUpdateError; override;
        function PSInTransaction: Boolean; override;
        function PSIsSQLBased: Boolean; override;
        function PSIsSQLSupported: Boolean; override;
        procedure PSReset; override;
        procedure PSSetParams(AParams: TParams); override;
        procedure PSSetCommandText(const CommandText: string); override;
        procedure PSStartTransaction; override;
        function PSUpdateRecord(UpdateKind: TUpdateKind; Delta: TDataSet): Boolean; override;
    ...
    end;
      

  2.   

    打得太多,怕没了,先贴一部份,下面续找两个重要的方法看看 IProviderSupport 中的具体实现
        procedure PSStartTransaction; override;
        procedure PSEndTransaction(Commit: Boolean); override;
        function PSInTransaction: Boolean; override; // adodb.pas 5816
    procedure TCustomADODataSet.PSStartTransaction;
    begin
      SetConnectionFlag(cfProvider, True);
      try
        // 哈,原来就这...
        Command.CommandObject.Get_ActiveConnection.BeginTrans;
      except
        SetConnectionFlag(cfProvider, False);
        raise;
      end;
    end;procedure TCustomADODataSet.PSEndTransaction(Commit: Boolean);
    var
      ActiveConnection: _Connection;
    begin
      // 得到原生的 connection
      ActiveConnection := Command.CommandObject.Get_ActiveConnection;
      if Assigned(ActiveConnection) then
      try
        // commit 事务,这些代码我也不是都清楚含义
        if Commit then
          ActiveConnection.CommitTrans else
          ActiveConnection.RollbackTrans;
      finally
        SetConnectionFlag(cfProvider, False);
      end;
    end;
      

  3.   

    再续我希望这份贴子尽可能的详细,帮助每个想知道MIDAS内部机制的兄弟
    说明一点,贴子的内容绝对原创,有些东西也是我的个人看法...有错请大家纠正以上说明了Borland 数据引擎控件的 IProviderSupport 能力,能看明白的兄弟只要看了就很容易明白 DataSetProvider 调用IProviderSupport部份代码,可以打开 Provider.pas 文件, search 文字 IProviderSupport,我就不多废话了...
      

  4.   

    我来跟一帖,好让comanche(太可怕)继续发言^_^
      

  5.   

    2.在前面已提到,改成了 MIDAS.dll, d3 以前是 dbclient.dll3.那个就是 com/com+ 事件,new 一个 activeForm 会有特别发现4.又是个超大问题,只说明一点, VMT只有一个, 每个对像都用同一个VMT, 引发的一个关键问题是在方法中怎样才能知道是那个对像的数据段被使用?实际上在每个oop的方法中都有一个隐藏参数,这个就是 delphi 中的 self, c++ 的 this5.哈 Integer(P) 想怎样显示怎样
      PChar变量 := String变量, 反过来也可以
      

  6.   

    学习了很多的东西,谢谢comanche,谢谢大家
    苹果兄为什么不发言??:)
      

  7.   

    idatabroker我现在也想不起来是在什么地方看见的~~~
    反正不是看源码的时候看见的,在哪本书%%....我晚上找找看
    谢谢大家捧场:))))嗷嗷
      

  8.   

    苹果对MIDAS不熟,而且这两周一直在加班,看到问题也没精力深入探讨,只好先一下。
      

  9.   

    我找到书上的原话了:(大家看看,讨论讨论)
    应用服务器上的远程数据模块支持IDataBroker接口,当客户程序与应用服务器连接以后,客户程序上的MIDAS连接构件就查找IDataBroker接口.IDataBroker只实现了一个方法叫GetProviderNames,调用这个方法可以获得一个列表,这个列表列出了应用服务器上的TDataSetProvider构件.TClientDataSet的ProviderName属性可以指定其中的一个TDataSetProvider构件.
    我现在的理解IDataBroker实现了TClientDataSet的ProviderName属性的功能,用于定位应用服务器,Iprovider接口用于在应用服务器和客户端之间进行数据交换.iprovider和iappserver是类似的,只是导出者不同.IproviderSupport用于数据集的定义
    TDataSet = class(TComponent, IProviderSupport),凡是数据集的组件都要实现这个接口.~~~~~~~~~~~~~以上是我个人现在的理解.大家帮我分析一下,加深我的理解.谢了(鞠躬):)
      

  10.   

    又一最新发现idatabroker和idispatch是一个东东
      

  11.   

    楼上就这么想知道IDataBroker是怎么回事?我看看SOURCE在STDVCL单元里,它是从IDispatch派生,增加了一个方法GetProviderNames
      

  12.   

    问个楼主, 你是哪本书上的? 这书不错啊..都来吧, 我发现这段时间我主爱留 [email protected]