COM 技术内幕学习之七 (类厂)
2008-03-11 11:49
357 查看
一、类上下文
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() 可以保证在客户使用类厂的过程中,不被卸载掉。
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() 可以保证在客户使用类厂的过程中,不被卸载掉。
相关文章推荐
- COM技术内幕学习心得
- COM 技术内幕学习之五 (动态链接)
- 学习进度(2012-7-11)(红黑树、多线程、算法分析与设计、COM技术内幕)
- COM技术内幕学习笔记---第七章---类厂
- COM技术内幕学习笔记(2)
- COM 技术内幕学习之二 (接口)
- COM技术内幕学习笔记---第八章---组件复用:包容和聚合
- COM技术内幕学习笔记
- COM 技术内幕学习之九 (简化程序编写)
- COM技术内幕学习笔记-COM概述
- COM 技术内幕学习之六 (HRESULT,GUID)
- COM 技术内幕学习之八(包容和聚合)
- COM 组件技术内幕之四 (引用计数)
- COM中的HRESULT, CLISD,ProgID, DLL注册,COM库函数的知识(COM技术内幕笔记之三)
- C#技术内幕 学习笔记
- COM技术内幕第六章笔记-HRESULT、GUID、注册表及其他
- 总结了编译Com技术内幕的最后例子的编译问题.
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记6)
- 总结了编译Com技术内幕的最后例子的编译问题.
- com技术内幕读书笔记2