当前位置:   article > 正文

C++插件化技术学习——基于COM的插件化_cmd com插件

cmd com插件

我理解,基于类多态的插件化对于一般的不跨语言不跨平台的应用程序来说已经够用了,今天要说的基于COM的插件化,我觉得更多的是针对大型的跨平台跨语言,需求变动较频繁,涉及领域较广泛的的应用而设计的。

COM是一种跨应用和语言共享二进制代码的方法,它明确指出二进制模块(DLLS和EXEs)必须被编译成与指定的结构匹配。我理解,COM其实就是定义了一种管理模块二进制代码的标准,不管你是用什么语言编写插件,最终都会转换为二进制,而依据COM标准就可以把插件都统一组织成COM对象,这样,基于COM的插件不受限于不同的语言了,而且更方便对插件进行统一的管理。从本质上来说,COM也是一种不局限操作系统的技术,但是目前貌似只在Windows操作系统出现过COM,有人见过在LINU或UNIX下使用COM的欢迎留言。

对于COM编程,我个人也了解不多,这里主要是学习下COM编程的思想,用于C++插件化的实现。据我了解,目前基于COM思想实现插件化主要有三种思路:

  1. 基于windows系统自带的COM库来实现
  2. 基于插件管理器+插件的形式的实现
  3. 基于OSGI+微内核+系统插件+应用插件的模式来实现

今天主要对第一种方法实现以下,第2,3种,我看网上有很多基于这两种思路自己写的插件框架,本人水平有限,还需继续学习相关内容。下面利用windows系统自带的COM库来实现一把基于COM的插件化,仍然以做衣服的案例来实现,其主要步骤如下.

主程序步骤:

  1. 初始化COM库
  2. 根据指定衣服样式(这里当作ProgID)获取对应的组件类ID
  3. 根据组件类ID创建COM对象,并返回IUnknown指针
  4. 根据协议接口ID查询协议接口类指针
  5. 调用协议内的功能函数
  6. 释放内存及COM库分配内存

插件实现步骤(即COM组件)

  1.  按照协议接口类编写子类并实现接口函数,同时要实现IUnKnown接口的函数
  2. 编写工厂子类,继承于IClassFactory,要实现IUnknown接口和IClassFactory接口,其中接口CreateInstance就是用来创建特定之类对象的
  3. 编写与COM库协议的4个协议函数 :(1)DllRegisterServer:注册插件;(2)DllUnregisterServer:删除注册插件;(3)DllCanUnloadNow:判断是否可以卸载本组建, 由CoFreeUnusedLibraries函数调用;(4)DllGetClassObject 获取工厂类对象
  4.  注册插件:
  5.  运行主程序

这里,重点讲一下CoCreateInstance函数创建对象的过程。该函数内部首先会调用与COM库的协议接口DllGetClassObject,来获取特定的子类工厂对象,然后根据子类工厂中重写的CreateInstance接口来获取特定的实现子类对象.。

另外,这里涉及几个标识符,首先,这里的给定字符表示“COMCTL.FallCloth”作为progID,用于标识该插件实现哪种样式的衣服,该progID下存储了一个GUID(“{9CA9DBE8-C0B1-42c9-B6C7-856BE5756855}”),这是一个全球唯一标识符,用于标识该组件类,以获取特定的子类对象.该组件类ID下的InprocServer32键下存储了插件dll对应的路径,这样,我们就可以根据给定的progID获取特定的dll&#x

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/861059
推荐阅读
相关标签
  

闽ICP备14008679号