初始化 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();
下一步
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈