网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > VC++ > 正文
VC++ 外壳扩展编程之windows右键菜单
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/15
下载{$ArticleTitle}原创论文样式

这次我想和大家一起讨论一下 Windows 的 Shell 扩展编程,首先在阅读以下内容之前我还是推荐大家看一下《COM技术内幕》这本大作,不过即使您没有有关的基础知识其实也是无所谓的,因为以下讲解是傻瓜式讲解。

开发环境

  • Windows Professional 2000
  • Microsoft Visual C++ 6.0 + ATL3.0

参考文献

  • COM技术内幕
  • ATL应用与开发指南(第二版)

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" 很乏味吗……。

编写组件  

  1. 建立工程: 打开VC++,新建一个"ATL Com AppWizard"模板工程,工程名称为:SimpleExt。

图 1.3

Shell扩展实例均为进程内组件,它们均以动态库的形式存在,所以在接下来的向导中我们用默认设置:"Dynamic Link Library(DLL)",然后点击"完成"。如 下图所示:

图 1.4

此时我们已经拥有了一个没有实现任何功能的进程内 COM 组件,为什么说"没有实现任何功能"呢?那是因为我们没有实现任何接口,再者在我们的DLL中也没有任何可供外部使用的接口。
    如果我们

网学推荐

免费论文

原创论文

浏览:
设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
湘ICP备09003080号