初始化 COM 库

任何使用 COM 的 Windows 程序都必须通过调用 CoInitializeEx 函数来初始化 COM 库。 每个使用 COM 接口的线程都必须对此函数进行单独的调用。 CoInitializeEx 具有以下签名:

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

第一个参数是保留的,必须为 NULL。 第二个参数指定程序将使用的线程模型。 COM 支持两种不同的线程模型: 单元线程多线程。 如果指定单元线程,则会做出以下保证:

  • 你将从单个线程访问每个 COM 对象;不会在多个线程之间共享 COM 接口指针。
  • 线程将具有消息循环。 (查看模块 1.) 中的窗口消息

如果其中任一约束都不是 true,请使用多线程模型。 若要指定线程模型,请在 dwCoInit 参数中设置以下标志之一。

标志 描述
COINIT_APARTMENTTHREADED 单元线程。
COINIT_MULTITHREADED 多线程。

 

必须恰好设置其中一个标志。 通常,创建窗口的线程应使用 COINIT_APARTMENTTHREADED 标志,其他线程应使用 COINIT_MULTITHREADED。 但是,某些 COM 组件需要特定的线程模型。 MSDN 文档应告知你何时出现这种情况。

注意

实际上,即使指定了单元线程,仍可使用称为 封送处理的技术在线程之间共享接口。 封送处理超出了本模块的范围。 重要的是,使用单元线程,绝不能简单地将接口指针复制到另一个线程。 有关 COM 线程模型的详细信息,请参阅 进程、线程和单元

 

除了前面提到的标志外,最好在 dwCoInit 参数中设置 COINIT_DISABLE_OLE1DDE 标志。 设置此标志可避免与对象链接和嵌入 (OLE) 1.0(一种过时的技术)关联的一些开销。

下面介绍如何初始化单元线程的 COM:

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

HRESULT 返回类型包含错误或成功代码。 我们将在下一部分中介绍 COM 错误处理。

取消初始化 COM 库

每次成功调用 CoInitializeEx 时,都必须在线程退出之前调用 CoUninitialize 。 此函数不采用任何参数,并且没有返回值。

CoUninitialize();

下一步

COM 中的错误代码