现在的位置: 首页 > 综合 > 正文

你真的懂CoCreateInstance吗?

2011年12月13日 ⁄ 综合 ⁄ 共 1041字 ⁄ 字号 评论关闭

阅读msdn,你会读到下面一段:

The CoCreateInstance helper function provides a convenient shortcut by connecting to the class object associated with the specified CLSID, creating an uninitialized instance, and releasing the class object. As such, it encapsulates the following functionality:

CoGetClassObject(rclsid, dwClsContext, NULL, IID_IClassFactory, &pCF); 
hresult 
= pCF->CreateInstance(pUnkOuter, riid, ppvObj) ;
pCF
->Release();

因此,你会认为CoCreateInstance实际上就是上面一段代码的封装。但是实际上,你错了。你没有留意到在这篇文章的开头的一句话:

Creates a single uninitialized object of the class associated with a specified CLSID. Call CoCreateInstance when you want to create only one object on the local system. 

这句话指明,在你希望系统只保存一个COM实例的时候使用此方法。那么CoCreateInstance是怎么做到这一点的呢?上面那三句话可以做到这一点吗?不能。一般情况下,每次调用CreateInstance时,都会创建一个实例。如果CoCreateInstance要保证只有一个实例,则COM库必须在第一次请求的时候保存一个接口引用。每次返回的接口,实际上都是调用下面的代码实现的: 

pIUnknown->QueryInterface(riid, void ** ppvObeject);

总结一下,调用CoCreateInstance实际上会做如下处理:
1、第一次使用CoCreateInstance时,此函数创建一个实例,并请求得到指定的接口引用,并保留此引用。然后调用QueryInterface方法返回请求的接口。
2、再次调用CoCreateInstance时,直接使用QueryInterface方法返回请求的接口,而不再生成新的COM实例。

以上是我做了很多次试验后的推测,并不保证正确。

抱歉!评论已关闭.