您现在的位置是: 软件 > 开发者网络 > 技术跟踪 > 技术理论 > 正文


-Win xp中的多种网络
-试验试验试验试验
-用Freehand实现位图矢量化
-网络电话面面观

组件对象模型的规则
2001-12-21· ·Charlie Kindel··microsoft

上一页  1 2 3  下一页


  内存管理规则

   接口指针的生命期管理总是通过建立在每个COM接口上的AddRef和Release方法来实现。(参见下面的“引用计数规则”)

   下面的规则适用于接口成员函数的参数,包括不是“按值”传递的返回值。

   对于参数来说,调用程序应分配和释放内存。

   出口参数必须由被调用程序分配,由调用程序用标准的COM内存分配程序来释放。

   出入参数首先由调用程序分配,必要时由被调用程序释放及重分配。至于出口参数,调用程序有责任释放最终返回变量。此时必须使用标准的COM内存分配程序。

   假如函数返回调用失败的代码,则通常调用者没办法清除出口和入出口参数。这导致了一些附加规则:

   错误返回时,出口参数必须可靠地被设置成可清除变量,它不能对调用程序有影响。

   此外,所有的出口指针参数(包括调用分配,被调用委任结构)必须被明显地设为NULL。最直接的方法是在函数说明项中设成NULL。

   返回错误时,所有的入出口参数必须为被调用者所搁置(这样保持为调用程序初始化的值;若调用程序没有对它初始化,则它是个出口参数,不是入出口参数),或者被明显地设为出口错误返回情况。

  参考计数规则:

   规则1:对于接口指针的每一个新的副本,AddRef必须被调用;Release在接口指针的每一个破坏时调用,除了子规则明显允许了其他情况。

   以下规则对应于规则1的非例外情况。

   规则1a:函数的入口出口参数。调用程序必须AddRef实际参数,因为当出口变量存放在它之上时,将由被调程序释放。

   规则1b:获取全局变量。从全局变量的已存在的指针副本得到的接口指针的局部副本,必须被独立地引用计数。因为存在局部副本时,被调函数会破坏全局副本。

   规则1c:新指针合成所需资源不多。函数使用内在知识合成接口指针,而不是从其他资源所得,此时必须对新指针做初始AddRef。这样的重要例子有事例生成法则,Iunknown::QueryInterface的实现,等等。

   规则1d:内部存储指针副本的返回。指针返回之后,被调程序不知道它的生命期和指针的内部存储副本如何联系。所以,被调程序必须在返回前对指针副本调用AddRef。

   规则2:对于接口指针的两个或更多的副本,它们的生命期的起始和终了的关系代码的特定知识,使AddRef/Release可以被省略。

  从COM客户的角度,引用计数是和接口对应的概念。客户不应认为对象的所有接口有同一引用计数。

  不应依赖于Addref & Release的返回值,而应用于调试目的。

  指针稳定性;参见在"Reference-Counting Rules"下的OLE帮助文件中的子部分:"Stabilizing the this Pointer and Keeping it Valid"。

  参见Douglas Hodges写的优秀的技术文章"Managing Object Lifetimes in OLE",及Kraig Brockschmidt (MSDN Library, Books)写的Inside OLE的第三章来获取更多信息。

  COM申请责任:

  以客户,服务器,对象执行者之一身份使用COM的每一进程,要对三件事负责:

   确定COM库是同COM函数CoBuildVersion一致的版本。

   在使用其他函数之前通过调用CoInitialize初始化COM库。

   在不用CoUninitialize时取消COM库的初始化。

   进程内服务器能假定载入的进程已执行了这些步骤。

上一页  1 2 3  下一页

【责任编辑:  】
【发表评论】【关闭窗口】
■ 相关内容
 Microsoft数据仓库架构
 MS SQL Sever 7.0 存储引擎
 XML 和 Windows CE 3.0
 Win32设备驱动程序的体系结构
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!