昨天已确知创建组件可以用COM库中的CoCreateInstance函数来创建某个接口的指针,但是该函数的灵活性不高,于是,提出了类厂的方法,类厂即是用来创建组件的组件。

关于CoGetClassObject函数:
    此函数我不知道与类厂有什么关联,但作者介绍类厂时,第一个着重介绍的就是此函数,此函数原型是这样的:
COM读书笔记之----类厂STDAPI CoGetClassObject(
COM读书笔记之----类厂  REFCLSID rclsid,
COM读书笔记之----类厂  DWORD dwClsContext,
COM读书笔记之----类厂  COSERVERINFO 
* pServerInfo,
COM读书笔记之----类厂  REFIID riid,
COM读书笔记之----类厂  LPVOID 
* ppv
COM读书笔记之----类厂);

看看与CoCreateInstance函数有什么不同,CoCreateInstance函数原型:
COM读书笔记之----类厂STDAPI CoCreateInstance(
COM读书笔记之----类厂  REFCLSID rclsid,
COM读书笔记之----类厂  LPUNKNOWN pUnkOuter,
COM读书笔记之----类厂  DWORD dwClsContext,
COM读书笔记之----类厂  REFIID riid,
COM读书笔记之----类厂  LPVOID 
* ppv
COM读书笔记之----类厂);

最大不同的地方就是函数的参数,一个需要的是IUnknown的指针作参数。一个需要的是COSERVERINFO的指针作参数。书上提到,CoCreateInstance函数返回的则是指向组件中某个接口的指针,CoGetClassObject函数返回的则是类厂中某个接口的指针。最大的区别就是返回的指针所指向的接口不同!

类厂所支持用于创建组件的标准接口是IClassFactory,大多数组件均可使用IClassFactory接口来创建。它的接口声明如下:

COM读书笔记之----类厂interface TClassFactory : IUnknown
}


可以从该接口的声明中看到,得到IClassFactory接口指针后,就是调用IClassFactory接口中的CreateInstance来获得某个接口的指针,以创建相应的组件。第一个参数pUnknownOuter同传给CoCreateInstance函数的IUnknown指针是相同的,用于聚合组件(聚合还不了解,没讲到,不用管它)。其余的参数均和传给QueryInterface的参数相同。

CoCreateInstance与CoGetClassObject的联系:
其实,CoCreateInstance比CoGetClassObject要简单一些,CoCreateInstance函数也是调用CoGetClassObject来实现的。代码如下所示:

COM读书笔记之----类厂HRESULT CoCreateInstance(REFCLSID rclsid,COM读书笔记之----类厂 LPUNKNOWN pUnkOuter,
    COM读书笔记之----类厂  DWORD dwClsContext, REFIID riid, LPVOID 
* ppv)
}


什么时候该用CoGetClassObject函数:
一,若想用不同于IClassFactory的某个创建接口来创建组件,必须使用CoGetClassObject。比如想用IClassFactory2来创建组件,因为CoCreateInstance里面是用得IClassFactory创建接口来创建的,所以肯定不行。
二,若需要创建一个组件的多个实例,则可以用CoGetClassObject来获得更高的效率,因为这样只需创建类厂一次,而CoCreateInstance则需为每个实例分配相应的类厂。

记住:类厂只不过是创建其它组件的一个简单组件。

相关文章:

  • 2021-11-13
  • 2022-12-23
  • 2021-10-10
  • 2022-02-11
  • 2021-09-08
  • 2022-12-23
  • 2021-08-23
  • 2022-02-26
猜你喜欢
  • 2021-12-20
  • 2022-12-23
  • 2021-12-28
  • 2021-07-04
  • 2022-12-23
  • 2021-06-04
  • 2022-12-23
相关资源
相似解决方案