Delphi 的接口机制浅探.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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

文档评论(0)

dqy118 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体上海海滋实业有限公司
IP属地上海
统一社会信用代码/组织机构代码
91310115MA7DL1JF2N

1亿VIP精品文档

相关文档