没有合适的资源?快使用搜索试试~ 我知道了~
首页Windows shell编程.pdf
资源详情
资源评论
资源推荐

用 VC++ 进行 Windows Shell 扩展编成
由 ccc 编译
序言:
看过一些对 windows 外壳的扩展程序,在使用上一般都是直接利用 windows 的外壳 API 做一些
工作,因为外壳操作需要一些比较专业的知识,因此,大部分编程人员特别是使用集成编程环境的程序人
员对 windows shell 的扩展编程不很了解,也缺乏这方面的资料。
在做过一些程序之后,感觉到使用 windows shell 的扩展编程可以使程序与操作系统的结合更加紧
密,就好像应用程序已经融入到操作系统之中一样。在使用 windows shell 扩张编程工具的过程中深切体
会到 windows shell 技术资料的重要性,为此,根据 Dino Esposito 的《Visual C++ Windows S
hell Programming》为蓝本,编译形成以下文字,为希望使用 windows shell 编程的人员提供一点帮助。
编译过程可能会出现错误,希望朋友们指正,请 Email 联系:ch2zh1@tom.com。本人将不胜感
激。
引言
欢迎阅读 CV++ Windows Shell 编程,在这本书中,你将学到怎样扩展 Windows Shell,客户化它的
行为和继承应用到 Windows Shell 中。你还将发现怎样使用和修改它的属性以达到最好的效能,以及调
用那些资料欠缺的 Shell API 函数的方法。对 Shell 编程并不困难,但是很少有关于这方面的完整资料进
行介绍。
系统的演变
在 Windows 95 和 Windows NT 4.0 中微软通过各种不同的扩展使操作系统的 Shell可编程并高度客
户化,Shell 和命名空间扩展只是其各种扩展的冰山一角。对 Shell 编程的一般理解还包括有 Shell 的 AP
I 函数和注册表键等,他们也可以转变你的 Win32 应用。
集成的 Web 浏览器已经混淆了本地与远程对象的差别,它在你的桌面上使用相同的风格表示每一个事物。
它可以扩展到包含用户的应用和资料。集成新的 Windows Shell 部件是这个进程的关键部分。所以,现
今的 Shell 不仅仅是 COM、扩展和用户接口,还包含了 Internet、动态 HTML 和脚本 Windows。Shel
l 已经成为了包含大量客户端技术的汇集点。每一个开发基于 Windows 代码的程序员,很快或不久就将需
要实际和深入例程来探索 Windows Shell 的内在特征。这本书包含了全部 API 函数详细说明,揭示其中

的 Bugs 和没有说明资料的特征。它深入到探测器的内部世界,带出其中闪亮的东西,比如,钩子、注册
表、浏览器帮助对象、Shell 扩展、命名空间扩展和 Web 观察。他还注意到 Windows 脚本环境扩展和 S
hell 脚本对象。
这本书是为专业开发者定制的,有三个主要的目标:
为现存的和资料贫乏的 Shell API 提供解释
给出新应用概念
显示关于 IE4.0、活动桌面和 Windows98 的新特征和这些新特征怎样适应以存在的 Shell。
本书范围
在这本书中我们见致力于回答下面一般的问题
什么是 Shell API 和我怎样使用它
怎样使用注册表来客户化我的 Windows Shell
我怎样才能建立向“回收站”和“我的公文包”那样的特殊目录
有哪些不同的方法把代码插入到探测器地址空间
怎样处理图标、任务条和“回收站”
什么是 Windows 脚本环境,我怎样才能使用它
什么是 Shell 脚本对象和浏览器帮助对象
我怎样才能实现 Shell 对我的应用处理的文档的支持
我怎样才能客户化我的文档的关联菜单
我怎样在 Shell 和命名空间扩展中使用 COM 和 ATL 来改变 Shell 的行为
怎样排除 Shell 扩展中的错误
解释建立成功的 Shell 集成的应用的原理和所需要的技术
我是怎样使用动态 HTML 客户化一个文件夹的
每一个 Shell 编程问题都使用实际例程进行说明,例子程序是由 VC++6.0 和 ATL3.0 书写的。这本书中
还有一些更有趣的例程:
“开始”按钮的子类
建立和安装新的增强型快捷方式处理器
和 Windows 脚本环境一起工作的新对象
依据控制板尺寸指派不同的图标和 Bitmap 文件的 Shell 扩展
探测器中的按键和建立新的文件夹
在探测器中把打开的窗口作为节点显示

技术准备
准备一台运行 Windows98、Windows95 或 Windows NT 4.0 (带有 ServicePack4.0)的计算机就不
用说了,还要特别注意的是有些例程要求你安装 IE4.0 以上版本。
代码是由 VC++6.0 和 ATL3.0 写成的,在 CV++5.0 中可能会有错误。书中还使用了 Windows 脚本环
境和 IE4.01 环境编写了一些示例。
习惯用法
书中使用不同的文字方格和布局来区分不同的信息。下面是一些例子和他们的意义。
框中是重要的说明资料,它们直接向关于上下文内容。
其它信息以文字形式出现如下.
重要文字以黑体形式给出
出现在屏幕山的文字,如菜单选择,与实际屏幕显示的字体相同
键盘上的按键如 Crtl 和 Delete 使用斜体
所有文件名都有 Pidl.cpp 这种风格
函数名则有 SHBrowseForFolder()这种风格
新的,重要的和与当前讨论问题相关的代码有如下形式:
void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
{
HWND hwndOK = GetDlgItem(g_hwndDlg, IDOK);
// Simulate the Close button being pressed
if(IsWindowEnabled(hwndOK))
PostMessage(g_hwndDlg, WM_COMMAND, IDCANCEL, 0);
}
第一章 Windows Shell 是什么

一个操作系统外壳的不错的定义是它是一个系统提供的用户界面,它允许用户执行公共的任务,如访
问文件系统,导出执行程序,改变系统设置等。MS-DOS 有一个 Command.COM 扮演着这个角色。然而 W
indows 已经有了图形界面环境,他的外壳程序也就必然是图形方式的。在 Windows95 以前,默认的 Wind
ows Shell 就是程序管理器。
程序管理器是一个中央控制台,从那里你可以启动应用程序,重排和重组图标,执行新任务。
换句话说,程序管理器就像他的名字提示的那样管理所有集中在 Windows 大伞之下的程序。现在对应程序
管理器的是文件管理器,它是一个专门为维护文件系统而设计的工具。
随着 Windows95 的出现,探测器取代了这两个老工具,并集成了二者的功能,如果你愿意,你
仍能发现文件管理器仍然深深地隐藏在 Windows 系统目录中。然而,由于用户友善性方面比他的后继者差,
现今已经很少使用了。
一般错误的概念认为,探测器就是一个程序,当你需要通过点击“我的计算机”或右击“开始”
按钮来浏览文件系统时这个程序启动。事实上,探测器总是启动和运行着的,从引导开始一直到你关闭计
算机。直觉是“探测器”实际上就是新概念下的窗口。探测器是一个可执行模块(explorer.exe),它
实现了 Windows 外壳功能。
在这一章中,主要是介绍外壳和探测器,更精确地讲是
Shell 的组成部分
探测器结构
Shell 的组成部分
Shell 由许多不同的部分组成,现在我们就从最显而易见的桌面和任务条开始。从概念上讲,桌面是
所有 Windows Shell 对象的父对象,即宿主对象。就实现方式而言,桌面是一个系统定义窗口类的特殊窗
口(命名为#32769),并且是所有窗口的祖先窗口。那些导出应用的顶层窗口一般而言都是桌面的子窗口。
在这些子窗口中有一个有趣的窗口子树,它的根是“程序管理器”。
你可以用 CV++带的工具 Spy++来检查窗口栈中打开的窗口。
程序管理器保持了兼容性,在图中你可以看到,他的封装结构:程序管理器的直接下级是一个命为 S
HELLDLL DefView 的窗口类,这个窗口包含了一个默认的观察对象,事实上这个窗口负责枚举标准文件
夹的内容,它总是从 ListView 控件中导出,这是一个通用的系统控件。SHELLDLL DefView 窗口包含了
一个 ListView(类名为 SysListView32)和一个标题控件(类名为 SysHeader32),标题控件仅仅用于 ListView 的
报告观察。
随着 IE4.0 的活动桌面和 Windows98 的发布,默认的观察对象已经有了基于某些浏览器能力的
变化。在下一章中我们将更进一步讨论这些观察对象和他们的变化。
程序管理器

就象前面提到的一样,程序管理器窗口是为了兼容性而保留的。它正好演示了一个窗口应用从 16 位
到 32 位的演变过程。在 Win16 环境中,与 Shell 唯一的通讯方式是通过动态数据交换(DDE)。这个层面
的代码在 Windows95 甚至 Windows98 中还在维护。为什么呢?,为了兼容性。
关于 DDE 接口变成与 Shell 的详细说明,建议察看资料 Internet ClientSDK 其中给出了最新的信
息。DDE 是一款较老的技术,微软已经有大量的资料说明。
任务条
主要的 Windows Shell 部件就是任务条,它实际上就是由探测器进程所拥有的一个窗口。每当你需要
终止探测器进程的时候,都将引起任务条的消失和重新显现。每当他重新显现的时候他注册一个具有不同
HWND 的新窗口。因而,就引用而言,你没有必要保留这个窗口的 HWND 。任务条也是也各拥有“开始”
按钮的窗口,在托盘区域有时钟和类似按钮的控件,表示正在运行的应用。
任务条实际上与窗口一样,可以在其上作任何窗口上可以做的操作如移动、隐藏和子类化等。
在第七章中我们将说明怎样子类化任务条和“开始”按钮。在第九章中可以找到怎样隐藏任务条和编成重
新启动 Shell。这后一个特性在编成实现 Shell 和命名空间扩展时是有用的。
桌面
你是否奇怪,桌面上的快捷方式是从哪里来的和属于谁,坦白地讲,开始我也认为探测器模块绘制
了这些图标,记录了用户设置,颜色,状态等。这个模块开可能在桌面背景上绘制用户设置的墙纸。
桌面并不是这样工作的,相反,快捷方式作为图标是由一个普通的 ListView 显示的。当然这个 L
istView 有了一个不寻常的变异,但是它确实是一个 ListView,因此它也就不难从消息中获取处理对象了,
将在第九章中给出例程进行说明。
探测器结构
探测器是一个扮演着系统外壳角色的应用程序。当说到外壳扩展的时候,我们讲的就是有探测
器感知的、装入的并最终执行的代码块。
探测器可以被看作为一个微型的窗口开发环境。想象一下:它有自己的函数和对话框;允许写
特殊的与已存在的体系集成的应用程序;能包容应用和文档。他甚至可以解释任何活动的脚本兼容语言的
脚本(VBScript,JScript,Perl,等等)。本书中将包含所有这些特征。
扩展的切入点
随 Windows3.1 一起发布的文件管理器有着非常好的旦未充分利用的特性,比如:它能够在运行时加
载 DLL,执行具有特殊原形的已注册函数等。也就是说,在这个资源中有一点,其代码本身能够知晓某些
活动是由用户执行的。换句话说,文件管理器支持扩展行为,当执行特定的活动时,查找注册的扩展并装
载和运行之。
我们后面在探测器外壳和命名空间扩展中见到的实际上有相同的原理。不同的完全是细节方面
的实现。文件管理器用于加载具有预定义原形的传统的 DLL 全程函数,而探测器是这一过程更加规范。尤
其是它采用 COM 接口(可以看作预定义和固定函数原型的集合)和进程内服务器(实质上的 DLL)
当然,COM 接口和进程内服务器比函数集和 DLL 更复杂,但是,这也使探测器进程比老的基于 DL
L 的进程更规范和有力。
对探测器的扩展
剩余383页未读,继续阅读















安全验证
文档复制为VIP权益,开通VIP直接复制

评论15