任何使用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组件需要特定的线程模型。MSDN文档应该告诉你什么时候是这样的情况。
注意事项 实际上,即使指定了单元线程,仍然可以使用称为编组的技术共享线程之间的接口。编组超出了本模块的范围。重要的一点是,在使用单元线程的情况下,不能简单地将接口指针复制到另一个线程。有关COM线程模型的更多信息,请参阅进程,线程和单线程和了解和使用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中的错误代码