关于CoGetClassObject函数:
此函数我不知道与类厂有什么关联,但作者介绍类厂时,第一个着重介绍的就是此函数,此函数原型是这样的:
看看与CoCreateInstance函数有什么不同,CoCreateInstance函数原型:
最大不同的地方就是函数的参数,一个需要的是IUnknown的指针作参数。一个需要的是COSERVERINFO的指针作参数。书上提到,CoCreateInstance函数返回的则是指向组件中某个接口的指针,CoGetClassObject函数返回的则是类厂中某个接口的指针。最大的区别就是返回的指针所指向的接口不同!
类厂所支持用于创建组件的标准接口是IClassFactory,大多数组件均可使用IClassFactory接口来创建。它的接口声明如下:
可以从该接口的声明中看到,得到IClassFactory接口指针后,就是调用IClassFactory接口中的CreateInstance来获得某个接口的指针,以创建相应的组件。第一个参数pUnknownOuter同传给CoCreateInstance函数的IUnknown指针是相同的,用于聚合组件(聚合还不了解,没讲到,不用管它)。其余的参数均和传给QueryInterface的参数相同。
CoCreateInstance与CoGetClassObject的联系:
其实,CoCreateInstance比CoGetClassObject要简单一些,CoCreateInstance函数也是调用CoGetClassObject来实现的。代码如下所示:
什么时候该用CoGetClassObject函数:
一,若想用不同于IClassFactory的某个创建接口来创建组件,必须使用CoGetClassObject。比如想用IClassFactory2来创建组件,因为CoCreateInstance里面是用得IClassFactory创建接口来创建的,所以肯定不行。
二,若需要创建一个组件的多个实例,则可以用CoGetClassObject来获得更高的效率,因为这样只需创建类厂一次,而CoCreateInstance则需为每个实例分配相应的类厂。
记住:类厂只不过是创建其它组件的一个简单组件。