一、类上下文
1、进程内服务器 (DLL)
2、进程中处理器 (只实现了一个组件中的一部分的进程中组件)
3、本地服务器 (EXE)
4、远程服务器 (要DCOM支持)
二、为什么需要类厂
1、CoCreateInstance函数的不灵活性
不能控制组件建立的过程,如控制内存装载位置和对客户进行权限验证。
三、类厂
1、唯一功能是创建其他的组件
2、某个特定的类厂只创建同某个特定的CLSID相应的组件
3、CoGetClassObject 返回的是指向组件所属类厂的指针,不是组件本身的指针
4、什么时候使用CoGetClassObject?
用IClassFactory2创建组件;创建同一组件的多个实例,只需创建类厂一次。
5、CoCreateInstance 流程
CoCreateInstance-->CoGetClassObject-------->访问注册表,加载DLL------>DllGetClassObject----->
创建类厂IClassFactory--->创建组件对象(返回接口指针)
6、同一个DLL中包含多个组件 (CLSID区分)
7、类厂的任一实例只能创建一个相对应的组件
8、CoFreeUnusedLibraries (释放掉不再使用的COM库)
其调用DllCanUnloadNow() 来询问DLL组件是否可以被卸载,DllCanUnloadNow()将检查该组件的引用计数是否为0.IClassFactory::LockServer() 可以保证在客户使用类厂的过程中,不被卸载掉。