1.CoCreateInstance的不灵活.
我们知道 CoCreateInstance创建组件的过程是:传给他一个CLSID,然后它创建相应的组件.,并返回所请求接口的指针,.CoCreateInstance没有提供一种可以控制组件创建过程的的方法.
存在问题: 我们不能控制组件创建过程.
解决方案: 使用一个专门创建组件的组件,既 类厂.
2.类厂.
实际上CoCreateInstance并没有创建组件,而是创建了一个被称为类厂的组件.
类厂唯一功能就是创建其他组件.
精确点讲就是.某个特定类厂将创建某个特定CLSID相应的组件. 客户可以通过类厂所支持的接口来对类厂创建组件的过程加以控制. 创建组件的标准接口是 IClassFactory,用CoCreateInstance创建的组件实际上是通过IClassFactory来创建的.
3.CoGetClassObject
要创建一个组件,首先要创建类厂本身.
CoCreateInstance()用来创建与指定CLSID的组件,并返回指向组件某个接口的指针.
与CoCreateInstance类似,用CoGetClassObject() 来创建与指定CLSID的类厂,并返回指向类厂某个接口的指针.
函树定义如下:
HRESULT __stdcall 用CoGetClassObject(
const CLSID & clsid,
DWORD dwClsContext, //server context
COSERVERINFO *pServerInfo, //Resevred for DCOM
const IID &iid,
void ** ppv
);
客户用 CoCreateInstanc 所返回的指针来创建所需的组件,这个指针通常是一个IClassFactory指针.
3.IClassFactory
类厂所支持的用于创建组件的标准接口是 IClassFactory.大部分组件可以通过它来创建.
声明如下:
interface IClassFactory :IUnknown
{
HRESULT stdcall CreateInstace(IUnknown * pUnknownOuter,
const IID &iid,
void **ppv);
HRESULT stdcall LockServer(bool bLock);
};
4.为什么要用用CoGetClassObject
大多数情况下使用 CoCreateInstanc 创建组件,而不使用CoGetClassObject。但是在以下两种情况 下应使用CoGetClassObject而不使用 CoCreateInstanc 。
1、若想用不同于 IClassFactory 的某个创建接口来创建组件,则必须使用CoGetClassObject。
2、若需要创建同一组件的多个不同实例,使用CoGetClassObject可以取得较高效率。因为这样只需相应组件的类厂一次,而CoCreateInstanc 需要为每个实例分别创建并释放相应的类厂。
另外,CoGetClassObject可以对组件的创建过程进行更多的控制。