COM插件模型浅谈

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

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

插件管理器(即:要使用这些插件的主程)

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

插件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() ;
  }
}

时间: 2024-09-18 14:08:13

COM插件模型浅谈的相关文章

浅谈socket同步和异步、阻塞和非阻塞、I/O模型_php技巧

在进行网络编程时,常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式 同步/异步主要针对C端: 同步:c端发出一个功能调用时,在没有得到结果之前,c端死等结果 例如:普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:c端一个异步过程调用发出后,调用者不会立刻得到结果.实际处理这个调用的部件在完成后,通过状态.通知和回调来通知调用者. 例如:ajax请求(异步): 事件触发->服务

浅谈sem漏斗模型每个要点

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 这个sem漏斗型模式,相信做sem人员都了解,做sem要步步为营,解决好每一步,你就离成功不远了,以下我就浅谈一下这个模型的每一步吧. 1,展现量,用户要看到你的推广信息,那账户的关键词就得展现在用户,那展现量与什么有关呢? ①匹配模式,(更改匹配模式,让更多潜在用户看到你的推广信息). ②关键词排名,关键词排名越靠前,用户就越容易看

读百度《浅谈网页搜索排序的投票模型》有感

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 百度搜索研发部官方博客的那篇<浅谈网页搜索排序中的投票模型>不知道大家有没有仔细看过,如果没有看过,建议大家可以认真的看一下,个人觉得这篇文章的观点对于我们SEO工作者来说,是一个比较靠谱的深入网页排名研究方向,里面谈到关于选举投票的很多困境,每种选举办法都有自己的弊端,作者再结合这些选举的方法,谈到在网页搜索排名投票原理中需要注

浅谈Android开发中项目的文件结构及规范化部署建议_java

一.几句话 使用Gradle及其推荐的项目框架 把密码等敏感数据放入gradle.properties 不要自己写Http客户端,使用Volley或OkHttp库 使用Jackson库来解析JSON数据 避免Guava并出于Dalvik 65K methods limit不要使用过多的库 使用Fragment来绘制UI界面 Activity主要用来管理Fragment 布局文件XML也是代码,好好组织它们 在布局文件里,使用styles以避免重复的属性 使用多个style文件而不是一个巨大的st

浅谈关于JavaScript API设计的一些建议和准则

  这篇文章主要介绍了浅谈关于JavaScript API设计的一些建议和准则,文中列举了许多知名的JS API进行辅助说明,极力推荐!需要的朋友可以参考下 设计是一个很普遍的概念,一般是可以理解为为即将做的某件事先形成一个计划或框架. (牛津英语词典)中,设计是一种将艺术,体系,硬件或者更多的东西编织到一块的主线.软件设计,特别是作为软件设计的次类的API设计,也是一样的.但是API设计常常很少关注软件发展,因为为其他程序员写代码的重要性要次于应用UI设计和最终用户体验. 但是API设计,作为

浅谈ASP.NET MVC 3中如何使用Model

昨天博客发了新文章,讲一下我对如何使用MVC中的Model的看法,不是什么大技术,当是一个技术讨论^^ 原文地址:http://www.youguanbumen.net/Article.aspx?id=79 原文: 前两天写了个文章ASP.NET MVC 3 -- Model远程验证,主要记录了一下ASP.NET MVC 3中新增的RemoteAttribute类的使用,得益于这个类,我们可以在模型中为属性配置客户端远程校验的业务,文章中给了出一个简单的实体类MyUser_Add,举了一个最常见

浅谈权限管理的对象模型和实现

对象 浅谈权限管理的对象模型和实现    beegee(原作) 关键字    权限管理 对象模型 ACL 电子政务 浅谈权限管理的对象模型和实现 beegee (2003-7-16) 目录: 1.权限管理问题的分析 1.1权限管理简要分析 1.2电子政务系统的权限管理 1.3商业化应用系统的权限管理 1.4他山之石 2.权限管理子系统设计 2.1权限管理子系统的总体目标 2.2权限管理子系统的对象模型 2.3注意与不足 3.权限管理子系统的实现 3.1面向对象的实现 3.2组件层与功能层对对象的

浅谈引用计数

浅谈引用计数前言 作为Delphi程序员,您可以不用看这节内容,但是如果您想更多的了解一些COM内部技术,或是在对象模型与引用模型之间可以进行很好的控制的话,笔者更希望你可以抽出些许时间来看这一切的内容,而益处提体的将很明显,您可以自由的用一些技巧来解决让您头疼的问题.好了,继续我们今天的交流: 在组件技术必备知识二中,我们对接口(Interface)进行了一些介绍,当我们并没有深入的对接口的实现/效率/优化等问题进行进一步的禅述,而了解它们的确对于我们以后的编程是有很大的帮助的,我们都知道,每

浅谈论坛应该怎样SEO优化

现在很多站长选择用论坛建站,因为比较方便,只要建设起来有了一定人气,每天的工作只是很轻松的管理帖子和用户,不需要太多的文章编辑和内容更新.所以,以DISCUZ和PHPWIND为代表的论坛站点一直很火.下面就浅谈下论坛的seo优化细节: 1.伪静态.论坛帖子的动态地址一般都比较常,带着很多参数,这样对搜索引擎非常不友好,会给搜索引擎增加负担,收录也会比较困难.开启伪静态后可以自定义帖子地址格式,对收录来说非常有利. 2.网站地图.百度有个<互联网论坛收录开放协议>,是百度网页搜索制定的论坛内容收