COM 库

使用 COM 的任何进程都必须初始化和取消初始化 COM 库。 除了作为一个规范,COM 还在此库中实现了一些重要的服务。 COM 库在 Microsoft Windows 中作为一组 DLL 和 EXE(主要是 Ole32.dll 和 Rpcss.exe)提供,其中包括:

  • 为数不多的基本功能,有助于创建 COM 应用程序,包括客户端和服务器。 对于客户端,COM 提供了创建对象的基本功能。 对于服务器,COM 提供了公开其对象的方法。

  • 实现定位器服务,COM 通过该服务从唯一的类标识符 (CLSID) 中确定哪个服务器实现该类以及该服务器所在的位置。 此服务包括对对象类的标识和实现的打包之间的间接级别(通常是系统注册表)的支持,以便客户端独立于打包,打包在未来可能会更改。

  • 当对象在本地或远程服务器中运行时,透明远程过程调用。

  • 一种标准机制,允许应用程序控制如何在其进程中分配内存,特别是需要在协作对象之间传递的内存,以便正确释放内存。

若要使用基本 COM 服务,客户端和进程外服务器中执行的所有 COM 线程在调用除内存分配调用之外的任何其他 COM 函数之前,必须调用 CoInitializeCoInitializeEx 函数。 CoInitializeEx 将替换另一个函数,并添加一个参数,用于指定线程的线程线程模型:单元线程或自由线程。 调用 CoInitialize 只需将线程模型设置为单元线程。

OLE 复合文档应用程序调用 OleInitialize 函数,该函数调用 CoInitializeEx,并执行复合文档所需的一些初始化。 因此,调用 OleInitialize 的线程不能是自由线程。 有关客户端和服务器中的线程处理的信息,请参阅进程、线程和单元

进程内服务器不调用初始化函数,因为它们被加载到已经调用过的进程中。 因此,进程内服务器必须在注册表中的 InprocServer32 键下设置其线程模型。 有关进程内服务器中线程问题的详细信息,请参阅进程内服务器线程问题

取消初始化库也很重要。 对于对 CoInitializeCoInitializeEx 的每个调用,必须有对 CoUninitialize 的相应调用。 对于对 OleInitialize 的每个调用,必须有对 OleUninitialize 的相应调用。

进程中服务器可以假设它们加载到的进程已经执行了这些步骤。

组件对象模型