扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
前言
随着技术的不断完善,微软Windows操作系统已成为当前个人计算机应用领域的主流操作系统。Windows操作系统提供了颇受用户喜爱的图形用户界面(GUI),微软为Windows的这个户界面保留了可扩充性,它使得基于32位的Windows应用程序可以通过多种方式来增强系统所提供的操作环境(也称为外壳,英文名称:Shell)。 通过对外壳的扩展,开发人员可以为用户提供其他的文件对象操作方式,或者简化文件系统和网络的浏览,或者使用户能更方便地调用文件系统中对各种对象进行处理的工具。为了说明基于COM接口技术的外壳扩展技术,本文首先编写一个简单的音频播放器,然后编写几个外壳扩展处理程序方便用户对指定文件的操作。
一、外壳编程的方法
编写外壳扩展(以下简称Shell)的应用程序有两种方法,第一种外壳扩展是指无需编程即可实现的Shell扩展,只需要修改相应的注册表条目就可以让Shell按照我们的意愿行事。第二种Shell扩展需要编程来实现,它的功能比第一种Shell扩展要强大得多,在本文中提到的Shell扩展所指的就是这一种。
Windows中Shell扩展处理程序都是基于COM接口,它通过特定的COM接口与Windows Shell进行正常的交互。为了让Windows Shell能找到扩展处理程序并与之交互,Windows Shell扩展处理程序需要遵循一定的规则,这个规则也是编写Windows Shell扩展处理程序时所要遵循的设计思路。这个规则包括两个方面:(1)Windows Shell扩展处理程序应该在注册表中预先设定的位置登记自己,以便Windows Shell能找到它;(2)Windows Shell扩展处理程序应该实现Windows Shell知道的几个特定的COM接口,以便与Windows Shell进行正常的交互。
编程实现Shell扩展一般按如下步骤:(1)创建一个服务器项目(通常为DLL);(2)为项目添加一个实现特定Shell接口的COM类;(3)为该COM类实现一个类工厂;(4)为服务器实现一些框架性的代码;(5)编译链接以生成COM服务器;(6)编辑需要的注册文件;(7)测试和调试Shell扩展程序。
二、外壳扩展编程实例
由于编写外壳扩展处理程序的基本步骤是相同的,所以本文仅给出了编写上下文相关菜单处理程序的详细编写过程。关于文件类的上下文相关菜单,当用户用鼠标右键单击Shell名字空间中某个元素时(如某文件、目录、服务器、工作组等,本文中特指AC-3音频文件),Shell将生成此类元素的缺省上下文相关菜单(注意不同的文件对象生成缺省菜单是不一样的),Shell会搜索注册表,装载此类文件对象所登记的上下文相关菜单扩展,以便让这些扩展程序向已生成的上下文相关菜单中加入另外一些定制的菜单项。如果要为某个文件类对象增加一个上下文相关菜单扩展程序,需要在Windows注册表的下列位置进行注册:
HKEY_CLASSES_ROOT
<.扩展名>=<文件类描述>
......
<文件类描述>
Shellex
ContextMenuHandlers
ContextMenuHandler_Name={该上下文相关菜单处理程序GUID }
需要说明的是,还需要为上下文相关菜单处理程序进行登记,以便Shell能够知道在哪里找到处理程序:
HKEY_CLASS_ROOT
CLSID
{该上下文相关菜单处理程序GUID}=<处理程序描述>
InProcServer32=<服务器所在完整路径>
"Threading Model"="Apartment"
解决这个问题后,剩下的问题就是Windows Shell与上下文相关菜单处理程序交互问题,这就需要上下文相关菜单处理程序在代码中实现两个Shell知道的接口,即IContextMenu接口和IShellExtInit接口。IShellExtInit接口只有一个成员函数,即Initialize,当Shell决定对选定调用上下文相关菜单处理程序时,它会首先调用IshellExtInit接口的Initialize方法,以要求处理程序对自己进行初始化。IContexMenu接口中定义了三个方法,它们分别是QueryContexMenu、InvokeCommand和GetCommandString()。当用户用鼠标右键单击文件对象时,Shell将要显示出其上下文相关菜单。这时系统将此文件对象的上下文相关菜单的地址传给此上下文相关菜单处理程序。但在处理程序中只应用此地址来向上下文相关菜单中加入菜单项,而不应修改或删除已有的菜单项,因为可能还会有其他处理程序在此前或此后向菜单中加入菜单项。最后,当所有的上下文相关菜单处理程序都被调用后,Shell再向此菜单中加入它的菜单选项。菜单中的菜单项可以是与特定类相关的(即适用于某种类型的所有文件),也可以是与某特定事例相关的(即只适用于单个文件对象)。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者