COM插件模型浅谈

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
作者: 杜春辉

下载源代码

一、关于普通DLL插件的实现VC知识库里已有文章介绍,但在很多大型的软件中(如ArcGis、Office)中都不是采用这种方法,基于COM的插件在当今的大型软件中应用的更广泛。

二、实现插件离不开三个要素

  1. 插件管理器(即:要使用这些插件的主程)
  2. 插件基本接口(即:插件与管理器都认可的接口标准),在DLL插件中这个要素通常是一个标准的C++头文件,在COM插件中我们常用一个包含基类的接口COM,在这个COM中它只定义接口,不作任何实现。
  3. 插件COM,在这些COM中,它们只实现基类COM库的接口,没有自己的接口。

  本文的例子中TestSvr是第一个要素,是插件管理器,plugin目录下的两个工程是第三个要素是插件COM,Interface code目录下的工程是提供基本类的COM,是我们上面提到的第二个要素。

三、在DLL插件中我们搜索插件的方法是将插件存放在与主程序相对固定的目录下,主程序通过搜索目录文件而搜索插件,在COM插件里我们不能用这种方法搜索插件,这里我们采用的方法是每个COM插件都注到一下固定的COM分组中,主程序在COM分组中搜索出插件 。
以下的代码是将一个COM注册、反注册到某一个COM组:
void SpecialReg(GUID ID_SubItem,BOOL bRegister)
{
	ICatRegister* pICatRegister = NULL ;
	HRESULT hr = ::CoCreateInstance(CLSID_StdComponentCategoriesMgr,
		                            NULL, 
					 CLSCTX_ALL, 
					 IID_ICatRegister,
		                            (void**)&pICatRegister) ;
	if (FAILED(hr))
	{
		ErrorMessage("Could not create the ComCat component.", hr);
		return ;
	}
	CATEGORYINFO CatInfo ;
	CatInfo.catid               = CATID_MyCategory ;
	CatInfo.lcid                = LOCALE_SYSTEM_DEFAULT ;
	wcscpy(CatInfo.szDescription,sCateGoryName) ;
	if (bRegister)
	{
		hr = pICatRegister->RegisterCategories(1, &CatInfo) ;
		hr = pICatRegister->RegisterClassImplCategories(ID_SubItem,
			                                    1, 
							&CATID_MyCategory) ;
	}
	else
	{
		hr = pICatRegister->UnRegisterClassImplCategories(ID_SubItem,
			                                    1, 
							&CATID_MyCategory);
		ICatInformation* pICatInformation = NULL ;
		hr = pICatRegister->QueryInterface(IID_ICatInformation, 
			                           (void**)&pICatInformation) ;
		IEnumCLSID* pIEnumCLSID = NULL ;
		hr = pICatInformation->EnumClassesOfCategories(1, 
			                  &CATID_MyCategory, 
					0, 
					NULL, 
					&pIEnumCLSID) ;
		CLSID clsid ;
		hr = pIEnumCLSID->Next(1, &clsid, NULL) ;
		if (hr == S_FALSE)
		{
			hr = pICatRegister->UnRegisterCategories(1, &CATID_MyCategory) ;
		}
		pIEnumCLSID->Release() ;
		pICatInformation->Release() ;
	}
	if (pICatRegister)
	{
		pICatRegister->Release() ;
	}
}
      
以下的代码是从COM组中列举各个COM组件
ICatInformationPtr pICatInformation(CLSID_StdComponentCategoriesMgr);
IEnumCLSID* pIEnumCLSID = NULL ;
HRESULT hr = pICatInformation->EnumClassesOfCategories(1, 
				     &CATID_RdExcelExportCategory, 
				     0, 
				     NULL, 
				     &pIEnumCLSID) ;

ASSERT(SUCCEEDED(hr)) ;

long nComandID = _BASE_COMMAND_ID_;
CLSID clsid ;
while ((hr = pIEnumCLSID->Next(1, &clsid, NULL)) == S_OK)
{
	RDINTERFACELib::ICommandPtr pCommand(clsid);
}      
C++插件框架 本文摘要: 本文汇总了多种编程语言的插件框架实现方案,主要包括: C++插件系统:介绍了pluma-framework、boost.dll框架,以及OSGi、CTK等成熟解决方案,重点讨论了动态库加载和接口设计方法。 C#插件实现:利用Assembly与AppDomain实现热插拔功能,支持插件式开发。 Qt插件框架:详细说明了Qt扩展应用程序的完整流程,包括接口定义、元数据处理、插件加载和信号槽连接机制,提供了QPluginLoader、Q_DECLARE_INTERFACE等关键宏的使用示例。 文章还 阅读详情

相关推荐

soem-w5500-rpi:Raspberry pi的开源实时EtherCAT主站

soem-w5500-rpi:Raspberry pi的开源实时EtherCAT主站

COM编程_第一讲_深入COM框架以及实现简单的COM

一丶我们要理解COM是什么(为什么理解) 现在很多人会用com(也就是ALT)但是不知道原理,如果改一点东西,那么整体的框架重来,因为你不懂改哪里,如果懂了,那么遇到问题,那么就会知道我要怎么做,是什么问题了 二丶什么是COM COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组...

weixin_30651273的博客 456

基于Cow框架,调用GPTs的插件.zip

GPT, 通常指的是“Generative Pre-trained Transformer”(生成式预训练转换器),是一个在自然语言处理(NLP)领域非常流行的深度学习模型架构。GPT模型由OpenAI公司开发,并在多个NLP任务上取得了显著的性能提升。 GPT模型的核心是一个多层Transformer解码器结构,它通过在海量的文本数据上进行预训练来学习语言的规律。这种预训练方式使得GPT模型能够捕捉到丰富的上下文信息,并生成流畅、自然的文本。 GPT模型的训练过程可以分为两个阶段: 预训练阶段:在这个阶段,模型会接触到大量的文本数据,并通过无监督学习的方式学习语言的结构和规律。具体来说,模型会尝试预测文本序列中的下一个词或短语,从而学习到语言的语法、语义和上下文信息。 微调阶段(也称为下游任务训练):在预训练完成后,模型会被应用到具体的NLP任务中,如文本分类、机器翻译、问答系统等。在这个阶段,模型会使用有标签的数据进行微调,以适应特定任务的需求。通过微调,模型能够学习到与任务相关的特定知识,并进一步提高在该任务上的性能。 GPT模型的优势在于其强大的生成能力和对上下文信息的捕捉能力。这使得GPT模型在自然语言生成、文本摘要、对话系统等领域具有广泛的应用前景。同时,GPT模型也面临一些挑战,如计算资源消耗大、训练时间长等问题。为了解决这些问题,研究人员不断提出新的优化方法和扩展模型架构,如GPT-2、GPT-3等,以进一步提高模型的性能和效率。

平台+插件软件设计思想基于COM原型实现的代码剖析

<br />为了帮助大家更好地理解平台+插件软件设计思想及基于COM原型实现的框架结构及相关代码,本文将具体介绍与分析各关键部分的代码实现。有关平台+插件软件设计思想的基本观点及全部源代码请参见CSDN的文档中心的http://blog.csdn.net/goldboar/archive/2003/09/29/21595.aspx文档和软件中心平台+插件原型实现源代码http://download.csdn.net/source/2842576。作者在此声明,此观点的相关文档及源代码只能用于学习与研究,未经

水上漂的专栏 2587

COM---注册表

// // Category.cpp - // 组件类演示程序 //// 不编译为 UNICODE.#include <stdlib.h> #include <iostream.h> #include <assert.h>#include <comcat.h>///////////////////////////////////////////////// // // 函数声明 //// 工

新博客:https://aping-dev.com/ 1199

CAA中获取装配体下零部件名称

CAA二次开发—获取装配体下零部件名称 CATFrmEditor*pCATFrmEditor=CATFrmEditor::GetCurrentEditor(); CATDocument*pCATDocument=pCATFrmEditor->GetDocument(); CATIDocRoots*piCATIDocRoots=NULL; HRESULT rc=pCATDocument->QueryInterface(IID_CATIDocRoots,(void**)&piCAT

qq_42983936的博客 1193

浅谈浏览器加载插件技术及其思考

一种全新的基于Html5浏览器加载插件方法:将客户端程序UI层绘制在内存画板上,并实时传输给浏览器网页,浏览器将其绘制在网页画布上;同时,浏览器画布实时监听鼠标键盘事件,实时传递给客户端程序,驱动客户端程序UI。让用户操作网页画布就像操作客户端程序。

allWeblugin中间件推广和宣传 1484

浅谈基于插件的软件框架(1)

     近段时间,由于项目需求,本人正在设计一个基于插件的软件框架,同时定义了一套插件规范,但是越到后面,越发现很多问题找不到很好的解决方法。这里本人将近段时间的一些心得体会与大家分享,同时将最近设计的一个插件框架进行简单的描述,望大家能多提意见,谢谢。     什么是插件?     插件是一种遵循一定规范的应用程序接口编写出来的程序。这些程序有一些统一的标准接口(当然每种规范定义的接口可能都不一样),所有插件功能的执行均通过这些接口实现。若将接口规范暴露给插件的制作者,那么任何一个人都能按照这一接口规范

寸心千里目 761

浅谈Excel开发:四 Excel 自定义函数

我们知道,Excel中有很多内置的函数,比如求和,求平均,字符串操作函数,金融函数等等。在有些时候,结合业务要求,这些函数可能不能满足我们的需求,比如我想要一个函数能够从WebService上

w36680130的博客 2259

鹰眼COM插件

一、什么是鹰眼 鹰眼移动监控是一款远程监控软件,它能让你随时随地远程监控电脑,获知电脑的运行状况。 鹰眼包含COM插件和android手机鹰眼应用,您可以通过按键精灵、VC、VB等程序语言调用鹰眼的COM插件向android手机鹰眼发送屏幕截图、文字消息,远程监控电脑的运行状况。 你可以在鹰眼官网(http://www.eeye007.com/)中下载鹰眼COM插件和android手机鹰眼安装程序,或在91助手等应用市场下载。 二、鹰眼的使用步骤 2.1下载产品 在官网(http://www.eeye007.com/home/product/)下载鹰眼插件、下载安卓APP。 2.2导入插件 例如:按键精灵。将插件导入附件,并释放到C盘eeye目录,然后注册插件。 按键精灵释放并注册代码 2.3登录手机APP 安装APP并使用注册的鹰眼账号登录。 2.4向APP发送消息 要发消息必须在程序上先登录、然后再发消息。例如: 2.5查看APP消息的情况

由云台协议DLL浅谈插件程序的编写 .

由云台协议DLL浅谈插件程序的编写(上)【原创】 前言:本文通过一个简单的工程描述了一种插件设计的思想。复杂设计和模块化分解能力是衡量一个程序员水平的重要标志,欢迎大家和我探讨。 1.我们的目的是在Plug-Ins目录里面查找“ptz*.dll”格式的云台插件的动态链接库。每个库可支持多个协议,通过查找该目录下的合法插件,有此插件创建出某个协议的实例,达到通过该协议操作云台的目的。 2.结构

Woosa 1167

浅谈Excel开发:十 Excel 开发中与线程相关的若干问题

    采用VSTO或者Shared Add-in等技术开发Excel插件,其实是在与Excel提供的API在打交道,Excel本身的组件大多数都是COM组件,也就是说通过Excel PIA来与COM进行交互。这其中会存在一些问题,这些问题如果处理不好,通常会导致在运行的时候会抛出难以调试的COM异常,从而导致我们开发出的Excel插件的不稳定。     和普通的WinForm程序一样,Exce...

weixin_33858336的博客 388

【大型软件开发】浅谈大型Qt软件开发(二)面向未来开发——来自未来的技术:COM组件。我如何做到让我们的教学模块像插件一样即插即用,以及为什么这么做。...

前言 最近我们项目部的核心产品正在进行重构,然后又是年底了,除了开发工作之外项目并不紧急,加上加班时间混不够了....所以就忙里偷闲把整个项目的开发思路聊一下,以供参考。 鉴于接下来的一年我要进行这个主框架的开发,本着精益求精的态度,加上之前维护前辈的产品代码确实给我这个刚毕业的社畜带来了不小的震撼,我决定在这个模块的开发中优化之前的开发模式,提升整个产品的健壮性和独立性。 开发一个大型软件最重...

Andius的博客 208

简易插件机制的实现方法浅谈

简介 插件(Plugin),是现代软件设计的一大亮点。通过插件机制,我们的应用程序可以最大化的获得可扩展性、适应性和稳定性,而且便于软件的维护和升级。对于插件的优缺点,我不做探讨。 在本文中你将了解到如何为应用程序实现一种简单、直接的插件机制。使用此种插件机制,我们可以开发出高度可扩展的应用程序,提高程序整体水平。 结构 我们的程序可以加载不同功能的插件——可以是我们自己或其...

weixin_30821731的博客 189

浅谈Excel开发:十一 针对64位Excel的插件的开发和部署

Office 2010版本开始有了32位和64位之分,对Excel来说,32位的Excel和64位的Excel在性能上的主要区别是64位的Excel能够处理2G及2G以上的大数据集。 随着64位操作系统的安装,Office 2010及以上版本的普及以及计算机的内存容量越来越高,使用64位Excel的用户越来越多,所以让插件支持64位Excel能够赢得一部分用户。前面十篇文章中所讲解的...

weixin_30583563的博客 826

浅谈Excel开发:一 Excel 开发概述

    做Office相关的开发工作快一年多了,在这一年多里,在插件的开发中遇到了各种各样的问题和困难,还好同事们都很厉害,在和他们的交流讨论中学到了很多的知识。目前Office相关的开发资料是比较少的,最最开始的时候,我看的是一本英文资料,然后再就是MSDN上面去提问了。所以我想写一点东西,让大家也少走一些弯路。     这篇文章就简要介绍一下Office开发的一些相关的知识,使大家对这个有一...

weixin_33894640的博客 1767

Mybatis plus源码浅谈--com.baomidou.mybatisplus.extension包

正文 在com.baomidou.mybatisplus.extension包的Model类中, 有这样一行注释 也就说明,使用Mybatis plus的前提,必须得让原Mapper继承baseMapper才有使用的可能,所以先加上吧 在其中有大量类似sqlSession.insert(sqlStatement(SqlMethod.INSERT_ONE),this)的方法 点进SqlMethod.INSERT_ONE方法中, 可以看到大量写好的,SQL语句,那么也就是说,Mybatis Plus一开

weixin_40598838的博客 2万+
上一篇: 使用VC++ ATL实现Office的COM插件
下一篇: 超酷代码:来自 COM 经验的八个教训
snaill
博客等级 码龄27年 599粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值