社区
网络通信/分布式开发
帖子详情
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
打赏
收藏
iappserver,iprovidersupport,idatabroker,iprovider是什么关系
还有几个问题: 2.midas不是说需要有个dbclient.dll支持吗,但我怎么找不到这个文件 3.什么是回调 4.delphi的虚拟方法表VMT是怎么回事, VMT是一个张表还是每个对象一张表,VMT中包含了那些内容,大概是如何工作的 5. 怎么样把指针的内容显示出来 怎么将pchar转换成string,请简单写一下代码。 谢谢(回答任何一个问题都有分)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
ABP框架的理解和总结
1、使用autom
app
er实现实体与DTO之间的映射。 2、ABP使用Castle Windsor为整个程序框架提供依赖注入的功能。 使用log4Net日志记录组件, 提供给其他各层调用以进行日志记录。 4、ABP的多租户模式是关闭的,我们可以在模块PreInitialize 方法中开启他。Configuration.Multitency.IsEnabled = true; 5、如果你使用了mo...
分布式多层数据库开发之
Data
Snap技术
多层分布式应用技术的关键是应用服务器的开发 应用服务器的开发步骤是 先建立应用程序,再在应用程序上建立远程数据模块。做好应用服务器之后,最后要注册服务器,运行一次便可以注册(本地,网络不知道) 客户端最终都是通过应用服务器的I
App
Server
接口与应用服务器进行通信的 工作流程: 1.用户启动客户程序。客户程序将试图连接应用服务器,如果应用服务器还没有运行,客户端程序将激活应用...
ABP框架学习笔记
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。 官网:http://www.aspnetboilerplate.com 1.代码使用的是 2.生成的代码结构是...
自定义
App
Server
TelnetSever.cs 1 public class Telnet
Server
:
App
Server
<TelnetSession> 2 { 3 protected override bool Setup(IRootConfig rootConfig, I
Server
Config config) 4 ...
远程调用技术代码追踪(socket)
远程调用技术内幕聊聊远程调用的相应技术。微软的模型是rpc, DCOM的封包就是OleVariant型的。经常听到有人说OleVariant的效率不高,其实MIDAS就是采用这种封包的。有人问方法的调用,秘密都在I
App
Server
这个接口里。 客户端要想调用服务器端的方法是需要代理DLL,和存根DLL的。具体的可以参考COM原理。进程内的就不说了,因为同一个地址空间,它可以通过指针去访问
网络通信/分布式开发
1,593
社区成员
32,964
社区内容
发帖
与我相关
我的任务
网络通信/分布式开发
Delphi 网络通信/分布式开发
复制链接
扫一扫
分享
社区描述
Delphi 网络通信/分布式开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章