"本文主要复习了COM(Component Object Model)中的聚合和多线程模型,以及分布式COM(DCOM)的基本概念和关键机制。重点介绍了COM聚合的不同方式以及DCOM中的对象激活、连接管理、并发管理和安全模型。"
在COM(组件对象模型)中,聚合是一种对象组合的方式,允许一个对象包含另一个对象,从而实现更复杂的功能。在非聚合方式下,对象A和对象B各自拥有独立的`IUnknown`接口,客户程序需要分别通过`QueryInterface`、`AddRef`和`Release`来访问和管理这两个对象。而在聚合方式下,对象B作为对象A的一部分,其`IUnknown`接口被对象A的`IUnknown`接口委托,客户程序只需与对象A交互即可访问对象B。
COM多线程模型是COM支持在多线程环境中工作的机制。它定义了五种线程模型: apartment-threaded (STA)、multi-threaded apartment (MTA)、neutral apartment (NA)、free-threaded marshaler (FTM) 和 single-threaded (STA, MTA)。STA适用于大多数用户界面组件,它们通常在单线程环境中运行,而MTA则用于可以在多个线程间共享的对象。NA是为在网络环境下使用的对象设计的,FTM则为那些不希望关心线程模型的对象提供服务。
DCOM(分布式COM)是COM的扩展,允许COM对象在不同进程甚至不同计算机之间进行通信。DCOM的基本结构包括客户端、代理对象、组件对象和存根代码。代理对象在客户端进程中创建,它实现了与远程组件相同的接口,并通过网络调用组件对象。组件对象在服务器进程中,存根代码则帮助组件处理来自代理的调用。
对象激活是DCOM的核心部分,它涉及对象实例的创建和定位。DCOM通过接口`IMarshal`来管理对象的序列化和反序列化,使得对象的状态能在进程间传递。连接管理负责维护客户端与服务器之间的连接,确保通信的稳定。并发管理则处理多线程环境中的同步和资源访问,确保线程安全。DCOM的安全模型则是为了确保跨进程的通信是安全的,它包括身份验证、授权和访问控制等机制。
标准的DCOM列集使用系统提供的代理和存根代码,但也可以自定义列集来提高性能或实现特定的需求。自定义列集要求对象和代理都实现`IMarshal`接口,并且代理对象需要处理所有的跨进程操作,如缓存状态以优化性能。
COM聚合和多线程模型提供了构建组件化软件的基础,而DCOM则进一步扩展了这些概念,使其能够在分布式环境中有效地工作。理解这些机制对于开发和维护跨平台、跨进程的COM应用程序至关重要。