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

本文介绍了基于COM的C++插件化技术,强调其在跨平台、跨语言场景中的适用性。COM定义了二进制代码共享标准,允许不同语言编写的插件以统一的COM对象形式组织。文章探讨了三种基于COM思想实现插件化的方法,并详细讲解了使用Windows系统自带COM库实现插件化的步骤,包括主程序和插件组件的创建、注册过程。
摘要由CSDN通过智能技术生成

我理解,基于类多态的插件化对于一般的不跨语言不跨平台的应用程序来说已经够用了,今天要说的基于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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值