📜  组件对象模型(COM)对象的生命周期

📅  最后修改于: 2021-08-25 18:46:06             🧑  作者: Mango

组件对象模型(COM)对象生命周期过程是利用组件对象模型(COM)进行有用的资源维护和组件交互的技术。 COM是由Microsoft开发的典型软件结构,它提供了用于集成软件程序组件的框架。

该框架允许开发人员在组装可重用组件的帮助下构造结构。通过定义应用程序编程接口(API),COM可以出于自定义目的批准因素的引入和集成,或者批准各种因素进行交互。仅当元素遵守Microsoft所针对的二进制结构时,Interplay才可行。如果使用专用编程语言编写的组件遵循此二进制结构,则可以互操作。

当客户端请求创建和使用COM对象时,COM的生命周期技术便开始发展。 COM对象生命周期中涉及以下步骤:

  1. 客户要求:
    COM客户端请求是对象创建的第一部分。在这里,COM客户端是调用COM API实例化新COM对象的每个实用程序。然后,它将唯一的CLSID或类ID传递给COM,并返回请求实例化的对象。 COM客户端负责两个特定的任务,如果它们在应用程序启动中不再完成,则必须在本部分的开始部分包括它们:
    • COM客户端需要确认COM库模型是足以支持通过应用程序预测的性能的新模型。通常,应用程序可以使用最新版本的库,但是不再使用较旧的库。
    • COM客户端必须初始化COM库。
      COM对象的客户端不断要求COM以完全相同的方式实例化对象,并且不依赖于所用服务器的类型,即它可以是进程内服务器,本地服务器或任何其他服务器。在讨论方法时,有两种方法,客户端利用这些方法进行请求。最简单的方法是调用COM函数CoCreateInstance。响应于此,创建了一个具有给定Class ID的对象,并且该对象返回了任何请求类型的接口指针。

      同样有一个替代选项,即通过调用CoGetClassObject,客户端可以实现并获取接口指针,该接口指针称为CLass ID的类工厂对象。此类工厂帮助称为IclassFactory的接口,消费者通过该接口要求工厂制造其类的对象。

  2. 服务器位置:
    COM对象生命周期中涉及的后续步骤是服务器位置。
    过程。在此步骤中,COM定位对象实现并启动对象的服务器系统。称为服务控制管理器或SCM的唯一元素,负责实现COM对象的COM服务器的位置和执行。 SCM确保在发出客户请求时,链接并准备好合适的服务器以获取请求。 SCM将所有类记录存储在系统注册表中,并以对象的类ID命名的唯一文本内容键下方。

    例如,服务控制管理器支持文件存储并存储COM服务器的文件路径名,这有助于对其进行本地化,并且一旦找到其位置便很容易。 COM客户端通过COM库获取这些记录。

    通过SCM采取的措施取决于COM服务器的种类:

    • 进行中–
      在此过程中,由SCM提供包含对象服务器实现的DLL的文件路径。然后COM库负责加载DLL,并进一步要求它提供其类工厂的接口指针。
    • 当地的 –
      在此过程中,SCM进一步查找并开始本地执行,该执行将注册类工厂的接口指针。
    • 偏僻的 –
      最后,在此过程中,本地SCM然后联系在适当的远程PC上运行的SCM,并将请求转发到较远的SCM。然后,进一步的远程SCM以上述两种方式之一获取类工厂的接口指针。

      远程SCM的函数是保持与该类工厂的连接,并将RPC连接返回到本地SCM。

  3. 对象创建:
    在COM对象的生命周期中,称为对象创建的第三阶段通过提供类ID来创建对象。它包括三个内部步骤:
    • 获取CLSID的类工厂。
    • 让类工厂实例化类的对象,并将接口指针返回给COM客户端。
    • 初始化COM对象。
  4. 相互作用 :
    初始化对象后,此过程的第四个阶段开始,称为交互。在此阶段中,客户端可以在接口指针的帮助下与新实例化的COM对象进行交互。

    创建阶段负责给客户端使用功能范围有限的单个接口指针。如果COM客户端需要在任何特定时间执行该范围之外的操作,则需要调用接口函数QueryInterface以便在同一对象上请求另一个接口。

  5. 断开连接:
    关闭过程阶段是当COM客户端不再需要COM对象时发生的断开连接。此步骤的基础是引用计数机制。该机制提供COM对象功能来操纵其自身的生命周期。因此,作为直接释放对象的替代方法,COM客户端需要通知对象释放自身。

    COM指定引用计数机制来提供此控件。每个对象都保持32位引用,该引用依赖于跟踪与之链接的客户端数量。使用32位计数器(可处理多达40亿个客户端)的能力无疑没有计数超载的威胁。

    有2个接口函数,AddRef和Release,控件计数,它们属于基本COM接口IUnknown。 AddRef函数用于增加计数,Release函数用于减少计数。当引用递减为零时,则意味着所有正在使用COM对象以及与之关联的客户端现在都已断开连接,并且COM对象会毁坏自己,即发生对象的自毁。