标题: com组件的继续浅谈 [打印本页]

作者: liuyang    时间: 2012-1-11 20:30
标题: com组件的继续浅谈
   com组件关于以DLL形式的编写 有以下几块。 

                   客户端调用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