网站大量收购闲置独家精品文档,联系QQ:2885784924

windows外壳扩展..doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
windows外壳扩展.

Windows外壳扩展 Windows外壳扩展的英文名称为:Windows Shell Extension。Windows外壳扩展是一类特殊的COM对象,在这类COM对象中用户可以加入自己的特殊功能,而Windows外壳扩展最终都会被Windows Explorer所引用。举个最简单的例子,比如 WinRar 应用程序,如果你安装完 WinRar 后,它会在你的右键菜单中加入很多快捷菜单,如 图1.1 所示: 图1.1 而上图却仅仅是外壳扩展编程中一种:Context Menu Handler。难道外壳扩展也分类吗?是的,但是不多,并且它们的实现大都一致,总体来说有如下几种分类: 表(一) 处理器类型 何时触发 所做处理? Context menu 处理器 当用户鼠标右击文件或文件夹时触发。但是在Shell V4.71+中,用户在文件夹目录的空白处点击鼠标右键也会触发该事件。 加入上下文菜单项。? Property sheet 处理器 当用户鼠标右击文件,选择文件属性菜单弹出文件属性对话框时触发。 加入用户自定义属性页。? Drag and drop 处理器 当用户在文件夹或桌面中用鼠标右键Drag/Drop文件或文件夹时触发。 加入上下文菜单项。? Drop处理器 当某一数据对象被Drag Over/Dropped Into某一文件时触发。 加入任何用户自定义动作。? QueryInfo 处理器(Shell V4.71+) 当用户鼠标滑过某一个文件或某一Shell对象时触发。 加入用户自定义提示信息(ToolTips)。? 也许有人会问我实现它们困难吗?答案是:比较简单。实现它是不是必须得去看那些枯燥乏味的ATL模板类,或者生硬死板的 MFC 宏定义呢?答案是否定的。也许以上的问题阻碍了大多数COM初学者的学习欲望,其实我刚接触ATL时多的是迷惘,常常抱怨 ATL 的知识太深奥,MFC的构架太生硬,一般我是不太喜欢用#define来定义程序的全部(请参阅 effective C++)。言归正传,我们再回到今天的话题上来,那么为实现 图1.1 所示功能可以通过哪些途径呢?答案有二,第一:注册表编程。第二:Shell Extension COM编程。通过注册表方式实现其实十分简单,请参阅 COM 组件注册表实现,在这里本文不做重复介绍,再者也不是本文的主题所在。在以下的内容中我会以第一类 Shell 扩展编程--- Context Menu 处理器 为例来讲解 Handler 的实现过程。 组件功能 该组件实现的功能为:当用户在Explorer中鼠标右击DLL类型文件时,在弹出的上下文菜单中注册我们自己的菜单项,如图1.2 所示: 图1.2 Register Component和UnRegister Component菜单项既是我们自己的菜单项。并且这两个菜单项分别完成进程内组件(DLL)的注册和反注册,菜单项的功能倒很简单,只是简单地执行了 Windows 的 Regsvr32.exe而已,但是我们已经感觉到它给我们带来的实用和方便,难道你不觉得 Over and Over 手工输入 Regsvr32 xxx.dll 或者 Regsvr32 /u xxx.dll 很乏味吗……。 编写组件  ? 建立工程: 打开VC++,新建一个ATL Com AppWizard模板工程,工程名称为:SimpleExt。 图 1.3 Shell扩展实例均为进程内组件,它们均以动态库的形式存在,所以在接下来的向导中我们用默认设置:Dynamic Link Library(DLL),然后点击完成。如 下图所示: 图 1.4 此时我们已经拥有了一个没有实现任何功能的进程内 COM 组件,为什么说没有实现任何功能呢?那是因为我们没有实现任何接口,再者在我们的DLL中也没有任何可供外部使用的接口。 如果我们的组件不继承其他外部已有接口,那么这样的COM组件实现起来则非常简单,它和编写普通类代码没有任何不一样的地方,只需要使用 ATL 接口的 Method 和Property 增/删向导即可实现。 显然我们的组件要继承 Shell 的扩展接口,并且还得实现所有继承的 Shell 接口,所以我们就不能完全依赖 ATL 的自动化了,这里需要我们自己写代码来实现该接口。首先我们通过 AT L向导新增一个简单接口 SimpleShlExt,如下图1.5,图1.6 和 图1.7 所示操作过程: 图 1.5 图 1.6 图 1.7 然后一切默认即可,这样ATL就为我们生成了一个组件框架,我们以下的讨论都基于此框架。  ? 2.添加代码 图1.8 组件类继承关系 图1.8 中红色方框是我们自己要实现

文档评论(0)

gangshou + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档