




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用COM编写插件安富国COM是微软公司为了解决软件版本冲突、组件跨平台冲突等问题而设计并主推的一种组件模型,其动态连接性和语言无关性使得COM成为实现插件极好的体系平台。COM与插件插件结构有助于编写有良好的扩充和定制功能的应用程序。例如,你可能想做一个有三个不同版本的软件(标准版、专业版和企业版),你不必写三套不同的代码,只需建立一个单独的主程序(host application),通过挂接插件实现三个不同的版本。另一个使用插件的好处是可以编制特定的功能模块挂接到你的主程序上面。这是近年来十分常见的一种技术,许多软件甚至操作系统或其外壳程序都有使用。例如,Win32的外壳程序资源管理器提供了大量的API和COM接口允许你编写自己的外壳扩展程序或者说外壳插件。COM( Component Object Model),即组件对象模型,是微软公司为了解决软件版本冲突、组件跨平台冲突等问题而设计并主推的一种组件模型,它提供了编写组件的一个标准方法,其动态连接性和语言无关性使得COM成为实现插件极好的体系平台。你可以用COM建立一个包含有主程序和插件的框架,它们可能是用不同的编程语言写成(VB、Delphi、C+等等),但由于建立在COM之上,它们之间完全能够无缝地结合在一起。下面,笔者将会一步步地制作一个建立在COM之上的插件框架。万能浏览器言归正传,一个插件框架包括两个部分:主程序(host)和插件(plugin)。主程序即“包含”插件的程序。主程序公布一个标准接口IHost,作为插件和主程序通信时用;同样,插件也公布一个标准接口 IPlugin,由主程序在与插件通信时调用。本文我们将要建立一个简单的程序称之为万能浏览器(universal Explorer)。这个浏览器可以用来查看任何有着层次结构的信息,如文件系统、数据库的主/从关系、组织结构图或家庭成员关系等。浏览器公布的宿主接口叫做IExplorer。浏览器的插件模块知道如何在层次信息中浏览、导航。例如,我们可以建立一个文件系统插件来浏览我们电脑上的文件系统。每个万能浏览器的插件都要公布一个插件接口称之为IExplorable。接口设计我们希望每个插件都要能描述它自己并且还要有一个指向它的宿主程序的指针,定义如下:IExplorable = interface procedure SetExplorer(Explorer);/ 由宿主程序调用设置IExplorable的指向宿主程序的指针 function GetDescription : string;/ 对自身的描述end;对于层次结构上任何一个指定的结点(node),万能浏览器都需要能够显示它的下级结点,这就需要我们建立一种机制,可以得到一个结点的子结点的信息。举例来说,在一个文件系统里,如果C驱下面有5个文件,万能浏览器就要问插件是哪5个文件,因此需为IExplorable提供第二个接口ISubItems,其定义如下:ISubItems = interface function GetCount : integer;/返回一个指定结点的子结点数目 function GetItem (Index) : string;/返回每一个下级结点(索引从0开始)end;有了ISubItems,万能浏览器可以得到指定结点的子结点的个数和内容。这里,我们需要为IExplorable增加一个方法来返回给定结点的ISubItems,定义如下:IExplorable = interface procedure SetExplorer(Explorer); function GetDescription : string; function GetSubItems (Path) : ISubItems; /返回给定结点的ISubItemsend;Path参数是指定结点的绝对路径,例如“GetSubItems (C:)”将返回C驱的下级文件及文件夹;而“GetSubItems (C:Level1Level2Level3)”则可以返回C:Level1Level2Level3的下级文件及文件夹。同样,我们还想得到任意给定结点的结点属性。简单起见,我们只对能表示为“名/值”对的信息感兴趣。比如,对于文件系统中的一个结点,会有如下的属性:属性名属性值文件类型文件(或文件夹)文件名filename.txt文件大小1234文件日期1/1/2000 12:00 am文件属性存档、只读为了实现上面的名/值对表,我们需要再在程序中加上一个GetProperties方法:IExplorable = interface procedure SetExplorer(Explorer); function GetDescription : string; function GetSubItems (Path) : ISubItems; function GetProperties (Path) : Array; /返回给定结点的名/值对end;稍后你就会看到,我们将会以一个二维数组的形式实现前面看到的文件属性列表。添加功能最后,要为我们的万能浏览器增加一个功能:一个上下文件相关的弹出式选单。这样一来,万能浏览器就能在我们的插件支持的任何一个结点上实现任意自定义的操作。在本例中,我们允许用户在任一结点(文件或文件夹)上右击鼠标并通过弹出选单为文件改名(Rename),其设计效果如图所示。执行一个自定义的上下文相关选单命令包括两个步骤:首先是在弹出选单中显示待执行命令,其次是实际执行用户从选单中选中的命令。换句话说,用户右击鼠标之后,万能浏览器先从插件中取得对应于这一结点的弹出选单命令列表就象下面的样子:根据上面的列表,万能浏览器在弹出选单中显示这些命令。用户单击一个选单项后,万能浏览器将告诉插件对选中的结点执行相应的命令(通过传递命令ID):IExplorable = interface procedure SetExplorer(Explorer); function GetDescription : string; function GetSubItems (Path) : ISubItems; function GetProperties (Path) : Array; function GetMenuActions (Path) : Array;/返回给定结点相关的弹出式选单命令 function DoMenuAction (Path; ActionId);/在给定结点执行命令end;值得注意的是,万能浏览器需调用GetMenuActions取得弹出式选单命令列表,一旦用户选择了一个选单项,它才调用DoMenuAction并激活同选单项对应的命令。让我们再来看一下如何实现主程序的接口。命令名命令idrename(改名)1delete(删除)2view(查看)3为了简化问题,笔者为IExplorer增加了一个方法,用于在文件改名之后插件能够调用这个方法。IExplorer = interface(IUnknown) procedure RenamePath (OldPath; NewPath);/结点改名后由插件调用end;插件使用RenamePath通知万能浏览器它的一个结点的名字变了。这样,主程序有机会执行相应的操作,具体说来,万能浏览器可以具体实现RenamePath从而在用户界面上直观地反映出结点名字的变化。开发注意事项1. 我们设计的万能浏览器将是一个MDI程序,每一个MDI子窗口装载一个单独的浏览插件。每个浏览插件被提交到一个极其单纯的TreeView用户界面。2.我们的文件系统浏览插件被做成了一个DLL服务器,这也是插件常用的实现手段。3. 插件接口IExplorable是基于IUnknown的,而不是我们更加熟悉的IDispatch。在类库里,笔者采用oleautomation标记IExplorable
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美美少年计划面试题及答案
- 肺炎治疗与康复
- 幼儿园运动会方案培训
- 2025年中国女式牛仔裤行业市场全景分析及前景机遇研判报告
- 4S店执行力培训
- 低血钾症状外科护理学
- 教育培训班教师工作总结
- CNAS认证实施流程
- 财务会计人员劳动合同续签与终止范本
- 电信礼仪培训
- 2024-2025学年广东省新部编版七年级历史第二学期期末模拟卷(含答案)
- 2025年新疆维吾尔自治区公务员录用考试面试真题试卷:无领导小组讨论边疆稳定与发展试题
- 2025年高考湖南卷物理真题(解析版)
- 七年级下册地理知识点总结(考点清单)(背记版)七年级地理下学期期末复习(人教2024版)
- 2025至2030中国汽车物流行业深度发展研究与企业投资战略规划报告
- 2025年四川富润招聘笔试冲刺题(带答案解析)
- 2024-2025学年人教版一年级下数学期末试卷(含答案)
- 2025山西万家寨水务控股集团所属企业校园招聘82人笔试参考题库附带答案详解
- 牙科手术安全核查流程与标准
- 【MOOC】《中国哲学》(北京师范大学) 章节作业中国大学慕课答案
- 中国当代文学专题-003-国开机考复习资料
评论
0/150
提交评论