iappserver,iprovidersupport,idatabroker,iprovider是什么关系

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

谢谢(回答任何一个问题都有分)
...全文
120 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
猛禽 2003-05-23
  • 打赏
  • 举报
回复
哈哈,你不服啊,本来我是不想跟你抢的,不过人家楼主即然这么大方,我当然就不客气了:)
comanche 2003-05-23
  • 打赏
  • 举报
回复
晕啊,昨天变放到洒里一天就实鸟骗走 20分
comanche 2003-05-23
  • 打赏
  • 举报
回复
问个楼主, 你是哪本书上的? 这书不错啊..

都来吧, 我发现这段时间我主爱留 msn

comanche@yeah.net
猛禽 2003-05-22
  • 打赏
  • 举报
回复
太可怕一发言,基本就没什么可补充的了:)
microjuz 2003-05-22
  • 打赏
  • 举报
回复
怎么没人讨论呢:((
microjuz 2003-05-22
  • 打赏
  • 举报
回复
又一最新发现idatabroker和idispatch是一个东东
microjuz 2003-05-22
  • 打赏
  • 举报
回复
结贴!!!
microjuz 2003-05-22
  • 打赏
  • 举报
回复
谢谢猛禽兄:)
猛禽 2003-05-22
  • 打赏
  • 举报
回复
楼上就这么想知道IDataBroker是怎么回事?我看看SOURCE

在STDVCL单元里,它是从IDispatch派生,增加了一个方法GetProviderNames
microjuz 2003-05-22
  • 打赏
  • 举报
回复
我靠,太可怕~~~这就是你得不对了:)那我上面说得对不对来,评价一下,我就不相信你们一点想法也没有
comanche 2003-05-21
  • 打赏
  • 举报
回复
2.在前面已提到,改成了 MIDAS.dll, d3 以前是 dbclient.dll

3.那个就是 com/com+ 事件,new 一个 activeForm 会有特别发现

4.又是个超大问题,只说明一点, VMT只有一个, 每个对像都用同一个VMT, 引发的一个关键问题是在方法中怎样才能知道是那个对像的数据段被使用?实际上在每个oop的方法中都有一个隐藏参数,这个就是 delphi 中的 self, c++ 的 this

5.哈 Integer(P) 想怎样显示怎样
PChar变量 := String变量, 反过来也可以
lvloj 2003-05-21
  • 打赏
  • 举报
回复
我来跟一帖,好让comanche(太可怕)继续发言^_^
comanche 2003-05-21
  • 打赏
  • 举报
回复
再续

我希望这份贴子尽可能的详细,帮助每个想知道MIDAS内部机制的兄弟
说明一点,贴子的内容绝对原创,有些东西也是我的个人看法...有错请大家纠正

以上说明了Borland 数据引擎控件的 IProviderSupport 能力,能看明白的兄弟只要看了就很容易明白 DataSetProvider 调用IProviderSupport部份代码,可以打开 Provider.pas 文件, search 文字 IProviderSupport,我就不多废话了...
comanche 2003-05-21
  • 打赏
  • 举报
回复
打得太多,怕没了,先贴一部份,下面续

找两个重要的方法看看 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;
comanche 2003-05-21
  • 打赏
  • 举报
回复
你问得可真多呵, 你在看 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;
microjuz 2003-05-21
  • 打赏
  • 举报
回复
我找到书上的原话了:(大家看看,讨论讨论)
应用服务器上的远程数据模块支持IDataBroker接口,当客户程序与应用服务器连接以后,客户程序上的MIDAS连接构件就查找IDataBroker接口.IDataBroker只实现了一个方法叫GetProviderNames,调用这个方法可以获得一个列表,这个列表列出了应用服务器上的TDataSetProvider构件.TClientDataSet的ProviderName属性可以指定其中的一个TDataSetProvider构件.
我现在的理解IDataBroker实现了TClientDataSet的ProviderName属性的功能,用于定位应用服务器,Iprovider接口用于在应用服务器和客户端之间进行数据交换.iprovider和iappserver是类似的,只是导出者不同.IproviderSupport用于数据集的定义
TDataSet = class(TComponent, IProviderSupport),凡是数据集的组件都要实现这个接口.

~~~~~~~~~~~~~以上是我个人现在的理解.大家帮我分析一下,加深我的理解.谢了(鞠躬):)
eastliangliang 2003-05-21
  • 打赏
  • 举报
回复
苹果对MIDAS不熟,而且这两周一直在加班,看到问题也没精力深入探讨,只好先mark一下。
microjuz 2003-05-21
  • 打赏
  • 举报
回复
idatabroker我现在也想不起来是在什么地方看见的~~~
反正不是看源码的时候看见的,在哪本书%%....我晚上找找看
谢谢大家捧场:))))嗷嗷
microjuz 2003-05-21
  • 打赏
  • 举报
回复
学习了很多的东西,谢谢comanche,谢谢大家
苹果兄为什么不发言??:)
pepo2000 2003-05-21
  • 打赏
  • 举报
回复
好文章,大家都来跟呀,好东东大家共享,太可怕是我们的好老师,谢谢!!!
加载更多回复(2)

1,593

社区成员

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

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