初始化 COM 库

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

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

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

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

如果上述任一限制条件不成立,则使用多线程模型。 若要指定线程模型,请在 dwCoInit 参数中设置以下标志之一。

标记 说明
COINIT_APARTMENTTHREADED 单元线程。
COINIT_MULTITHREADED 多线程。

 

您必须准确设置其中一个标志。 通常,创建窗口的线程应使用 COINIT_APARTMENTTHREADED 标志,其他线程应使用 COINIT_MULTITHREADED。 但是,某些 COM 组件需要特定的线程模型。

注意

实际上,即使您指定单元线程,仍可以通过使用称为 Marshaling 处理的技术在线程之间共享接口。 Marshaling 超出了本模块的范围。 重要的一点是,使用单元线程处理时,绝不能简单地将接口指针复制到另一个线程。 有关 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 中的错误代码