你真的懂CoCreateInstance吗?
阅读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实例。
以上是我做了很多次试验后的推测,并不保证正确。