COM 类厂和DllGetObjectClass函数
2022-02-07
146
0
类厂是COM对象的生产基地,COM库通过类厂创建COM对象;对应每一个COM类,都有一个类厂,用于该COM类的对象创建操作。类厂本身也是一个COM对象,它支持一个特殊接口(IClassFactory):
class IClassFactory:public IUnknown
{
virtual HRESULT _stdcall CreateInstance(IUnknown * pUnknownOuter,const IID& iid,void ** ppv)= 0;
virtual HRESULT _stdcall LockServer(BOOL bLock)= 0;
}
- CreateInstance用于创建对应的COM对象。第一个参数pUnknownOuter用于对象类被聚合的情形,一般设为NULL;第二个参数iid是对象创建完成后,客户请求的接口IID;第三个参数ppv存放返回的接口指针。
- LockServer用于控制组件的生存期。类厂对象是由DLL导出函数DllGetClassObject创建的。
原型:HRESULT DllGetClassObject(const CLSID& clsid,const IID& iid,(void **)ppv)
;
DllGetClassObject的第一个参数为待创建对象的CLSID。因为一个组件可能实现了多个COM对象类,所以在DllGetClassObject参数中有必要指定CLSID,以便创建正确的类厂。另两个参数iid和ppv分别指于指定接口IID和存放类厂接口指针。
COM库在接到对象创建指令后,调用进程内组件的DllGetClassObject,由该函数创建类厂对象,并返回类厂对象的接口指针。COM库或客户一旦拥有类厂的接口指针,就可通过IClassFactory成员函数CreateInstance创建相应的COM对象。