客户端调用CoCreateInstance,导致调用CoGetClassObject,CoGetClassObject通过查找注册表,得知 DLL位置,文件名,然后调用DLL中DllGetClassObject,DllGetClassObject的功能是返回CFactory的实例.返 回后,回到CoCreateInstance,通过CFactory的指针,调用pClassFactory->CreaetInstance() 创建组件实例 。
上面告诉你客户端获取COM组件一些实现接口对象的2个API函数具体内部实现流程。 从这里我们就可推测出有个工厂类用来创建接口实现类对象。整个框架就可以出来了:
COM组件中又一系列自定以的接口继承了IUnKown 接口,这个接口里有3个方法 QueryInterface()查询并返回接口的实现类的指针 AddRef ()自增加计数 Release()自减计数 。 所有接口类的实现类都必须实现这个3个方法。
一个COM组件会有多个类工产,所有使用DllGetClassObject()来产生相应的类工厂,类工厂古名思议就是用来生产接口实现类的类,当然类 工厂也继承了IFactroy的接口CreateInstance()创建接口对象 LockServer()同时IFactroy也继承了IUnKown 接口所有还有前3个接口 QueryInterface()AddRef ()Release()共有6个接口。
COM组件是需要注册的,因为它需要把16*8位的全局唯一标示符、一个字符串命名、路径一起保存到注册表里,程序可以通过一个一个字符串命名到注册表中找到相应的128位标示符与路径,来加载DLL。
所有这里就必须需要写个(函数名不能更改)
DllRegisterServer ()注册com组件 里面的代码就是上面写的吧相应的信息用注册WINAPI吧相应的信息注册到注册表中 resgvr32那个注册器的实现代码我也可以简单说下,其实那个只不过是传个DLL路径和DLL命名,然后调用加载dll的 LoadLibrary() 然后再嗲用GetProcAddress("","DllRegisterServer "),按此你可以自己写个resgvr32。
DllUnregisterServer()卸载 里面写的卸载刚才注册的信息
DllCanUnloadNow() 这个是判断是否可以卸载这个COM组件的引用,估计是定时去检测的。里面的代码就是2个计数变量的判断是否不再使用即=0;
所有综上所述,COM组件只需输出4个函数
DllGetClassObject @1 PRIVATE
DllRegisterServer @2 PRIVATE
DllUnregisterServer @3 PRIVATE
DllCanUnloadNow @4 PRIVATE
呵呵,至此我吧自己研究的全部贴了出来。这只是简单的COM组件的框架。呵呵,还有其他的我没有时间深入研究了,奉献出来给大家一起探讨。
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |