初始化 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();
下一步