- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Delphi的接口机制浅探
savetime2k@2004.2.3
Delphi的OpenToolsAPI全是用interface实现的。为了学习OpenToolsAPI,只好先学interface;为了学习interface,又必须先学COM。这样,我先花了三天看完了COM原理,再花二天考查Delphi的interface实现过程,得以整理出此文。
这不是一篇关于接口应用的文章,而是接口操作的编译器实现过程。我还没有真正使用过接口,也不知道包容和聚合模型是如何实现的,更不知道ActiveX和OLE是何物,所以不要问我应用方面的问题,我现在真的不懂。我倒是很希望有人能说一说Delphi的聚合是如何实现的(欢迎在本贴回复)。
在interface的学习过程中,我觉得对COM原理的理解是很重要的。本来我不想公开的自己的COM学习笔记,毕竟那是潘爱民的作品。不过我想如果有人和我一样,是完全不懂COM也希望能了解interface的实现机制,我愿意将此笔记公开作为本文的参考,希望不要在公共媒体张贴。[/keylife/iblog_show.asp?xid=5724]
目录
===============================================================================
接口的引用计数管理
接口指针总是被初始化为nil
接口指针赋值为对象
接口指针赋值为接口指针接口引用计数使用规则小结
接口对象的编译器实现接口对象的内存空间接口跳转表
对象内存空间中接口跳转指针的初始化
implements的实现
以接口成员变量实现implements
以对象成员变量实现implements
===============================================================================
本文排版格式为:
正文由窗口自动换行;所有代码以80字符为边界;中英文字符以空格符分隔。
(作者保留对本文的所有权利,未经作者同意请勿在在任何公共媒体转载。)
正文
===============================================================================
接口的引用计数管理
===============================================================================
接口指针总是被初始化为nil
接口是生存期自管理对象,即使是局部接口指针,也总是被初始化为nil。接口指针被初始化为nil是很重要的,从下文中Delphi生成维护接口引用计数的代码时可以看到这一点。
当接口与一个对象连接时,编译器会执行一些特殊的代码维护接口对象的引用计数。例如以下代码:
var
MyObject:TMyObject;
MyIntf,MyIntf2:IInterface;
begin
MyObject:=TMyObject.Create;//创建TMyObject对象MyIntf:=MyObject; //将接口指向MyObject对象MyIntf2:=MyIntf; //接口指针的赋值
end;
接口指针赋值为对象
当执行到MyIntf:=MyObject语句时,编译器的实现是:
如果MyObjectnil,则设置一临时接口指针P指向MyObject对象内存空间中的“接口跳转表”指针(后面会分析“接口跳转表”);否则P:=nil;
执行System.pas中的_IntfCopy(MyIntf,P)操作,进行引用计数管理;
{System.pas}
procedure_IntfCopy(varDest:IInterface;constSource:IInterface);var
P:Pointer;begin
P:=Pointer(Dest); //保存目的接口指针,用于后面的Release调用
ifSourcenilthen //源接口指针增加引用计数
Source._AddRef;
Pointer(Dest):=Pointer(Source);//目的接口指针赋值为源接口指针
ifPnilthen //原目的接口指针减少引用计数
IInterface(P)._Release;end;
_IntfCopy
您可能关注的文档
最近下载
- 基层儿科医务人员服务能力提升学习班答案-2024华医网继续教育答案.docx VIP
- 中学生素质发展评价手册42p.pdf VIP
- 《反对党八股》名师教学课件 (1).pptx VIP
- 薛法根:《风娃娃》(二年级).docx
- 40篇英语短文搞定高考3500个单词(全部含翻译-重点解析).doc
- SY∕T 4113.7-2020 管道防腐层性能试验方法 第7部分:厚度测试.pdf
- 阿里全球数学竞赛姜萍成绩造假PPT课件.pptx VIP
- FM知识考试试题-必做经典大题.pdf
- 旅游管理职业生涯规划.pdf
- 江苏省南京市2025届高三零模作文“点外卖”与“送外卖”导写(真题呈现+审题立意+素材积累+写作示例+考场范文).docx VIP
文档评论(0)