序言:
看过一些对windows 外壳的扩展程序,在使用上一般都是直接利用windows的外壳API做一些工作,因为外壳操作需要一些比较专业的知识,因此,大部分编程人员特别是使用集成编程环境的程序人员对windows shell的扩展编程不很了解,也缺乏这方面的资料。
在做过一些程序之后,感觉到使用windows shell的扩展编程可以使程序与操作系统的结合更加紧密,就好像应用程序已经融入到操作系统之中一样。在使用windows shell扩张编程工具的过程中深切体会到windows shell技术资料的重要性,为此,根据Dino Esposito的《Visual C++ Windows Shell Programming》为蓝本,编译形成以下文字,为希望使用windows shell编程的人员提供一点帮助。
系统的演变
在Windows 95 和 Windows NT 4.0 中微软通过各种不同的扩展使操作系统的Shell可编程并高度客户化,Shell和命名空间扩展只是其各种扩展的冰山一角。对Shell编程的一般理解还包括有Shell的API函数和注册表键等,他们也可以转变你的Win32应用。
集成的Web浏览器已经混淆了本地与远程对象的差别,它在你的桌面上使用相同的风格表示每一个事物。它可以扩展到包含用户的应用和资料。集成新的Windows Shell部件是这个进程的关键部分。所以,现今的Shell 不仅仅是COM、扩展和用户接口,还包含了Internet、动态HTML和脚本Windows。Shell已经成为了包含大量客户端技术的汇集点。每一个开发基于Windows代码的程序员,很快或不久就将需要实际和深入例程来探索Windows Shell 的内在特征。这本书包含了全部API函数详细说明,揭示其中的Bugs和没有说明资料的特征。它深入到探测器的内部世界,带出其中闪亮的东西,比如,钩子、注册表、浏览器帮助对象、Shell 扩展、命名空间扩展和Web观察。他还注意到Windows脚本环境扩展和Shell脚本对象。
这本书是为专业开发者定制的,有三个主要的目标:
为现存的和资料贫乏的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);
}