编写可复用性更好的C++代码:Band对象和COMToys(4)
第一部分:Band 对象介绍
第二部分:BandObj的类层次和MyBands服务程序的注册
第三部分:深入Band内部,揭开Band的面纱
第四部分 Band对象使用中遇到的一些问题
前面所描述的是一些Band对象的基本操作和处理,这些基本操作理论上都是按照你设计好的思路实现了所要的功能。但在实际的编程过程中,并不是每一件事情都按照它应该的方式进行。下面将告诉你有关Band对象使用中可能遇到的问题。
文档中说桌面Band必须实现IPersistStream接口来存储持久性数据。到底是什么数据呢?根据跟踪诊断显示,只有桌面Band 会查询IPersistStream接口,而Explorer是不会查询IPersistStream接口的,但要查询IPersistStreamInit接口。那么IPersistStream有什么用呢?又一则隐藏在微软例子代码中的注释是这样说的:"如果用户要拖拽桌面Band离开任务栏到桌面上,则IPersistStream是必须要实现的接口。"如第一部分中的图二所示,如果你不想要这个特性,就不用实现IPersistStream接口。
TRACE还显示Windows查询IOleCommandTarget 和IDiscardableBrowserProperty接口。后面的这个接口是我特别喜爱的接口之一,它没有函数!有人会问怎么可能一个接口不带函数呢?IDiscardableBrowserProperty只是用来通知IE:"如果你访问另一个页面,便可以丢弃我的页面数据。它们是可消耗的。"有关IDiscardableBrowserProperty的详细信息参见MSDN的另一篇文章:"Discardable Properties for Your WebPages in InternetExplorer 4.0"。
最后,TRACE揭示Windows还要查询另一个神秘的接口,它就是——{EA5F2D61-E008-11CF-99CB-00C04FD64497},这个ID未出现在任何文档里面,源文件或注册表当中。如果有那位仁兄知道有关这个接口的信息的话,请把它公诸于世。
当你第一次创建桌面Band时,可能会遇到Windows不识别它的麻烦。但对于浏览栏(info和comm类型的Band),只需重新启动一次IE或资源管理器即可。对于Windows不识别桌面Band的问题,只有一个解决方法就是用Ctrl-Alt-Del杀掉资源管理器进程或重启机器。但最近我在新安装的第二版Windows 98中测试时,发现我的桌面Band神秘地停止工作。不管我注册多少次DLL和杀掉资源管理器进程都没用,我的桌面Band拒绝出现。同样的问题还发生在Windows 2000中。
经历了无数困惑和坎坷之后,我几乎绝望了。这时我想起求助于MS的老大,他们可能会解决这个问题。得到的答复是叫我参考微软知识库的有关文章--Q214842,这篇文章解开了这个秘密--"Windows 2000(第二版Windows 98也是同样的问题)只在它感应到有一个运行的安装程序或者注册表中没有提供缓冲(cache)位置的时候才刷新种类缓冲。" Windows"能感应"到安装程序?。它是超人吗?本文下面要揭示有两种方法使得资源管理器重新建立种类缓冲:从setup.exe或者install.exe程序安装(这就是所谓的超人力量,不过如此!)或删除下面的这个注册表键:
Web:- 如何重装xp系统图解
- 下载Flash播放插件
- 巧妙清除Windows 2000/XP登录密码
- 如何利用路由器设置局域网
- QQ空间打不开
- 开机后鼠标不动怎么办
- Excel密码保护的解除方法与解除原理
- Windows XP注册表详解
- 3dmax不锈钢金属材质的制作方法
- 硬盘变成raw格式怎么办
图十五
有关MyBands/BandObj的源代码很长,全都是单调乏味的MFC嵌套类COM代码。有兴趣就去下载源代码看吧!
小结
可复用编程的实质是确定通用行为并将它封装到可以在不同场合重复使用的类或子例程当中。对于Band对象而言,BandObj将Band对象精炼成四个方面:类ID(GUID),MFC类,资源ID,以及种类ID。加上其它相关的资源。每一种Band对象,其COM接口及其数据之间的交换基本上大同小异。所以为什么还要自己去写全部的代码呢?没有理由不使用BandObj来创建与Band对象有关的应用。所有你要做的只是从框架类派生并调用AddBandClass。某些程序员会反对说BandObj依赖MFC及其庞大的MFC42.DLL。没错,但是我不认为那有什么负担,至少对于外壳扩展是这样。MFC42.DLL被认为是Windows的一部分,它可以用于所有的Windows应用当中。
如果你看一看CBandObj,就会明白它的通用性所在——不仅仅是针对Band对象,它适用于所有的COM类。CBandObj用CMenu和加速键表实现了IContextMenu和IInputObject。还要求Band对象做些什么呢?它的IOleWindow 和IDockingWindow实现只需要一个CWnd。IObjectWithSite保存指针,就这么简单。与Band对象有关的只有一个接口IDeskBand及其仅有的一个函数GetBandInfo。其它所有的东西都没有什么实质性内容。它尽可能地在更深的层次上抽象这些接口的实现,在小巧的类中使你能轻松组装并一次又一次地在各种情况下重用这些接口。Shell文件夹,文件阅读器,ActiveX控件——所有一切。你只要组装几段代码并编译它就可以建立这些COM对象。这实在是太棒了。
从下一部分开始,我将利用BandObj来建立自己COMToys,从而向你展示如何使用BandObj。(待续)
Web: 进入讨论组讨论。- 最新文章
- C++ Builder开发经验几则[01-03]
- 编写可复用性更好的C++代码:Band对象和COMToys(..[01-03]
- 在VB中设计倒计时程序[01-03]
- 用VB函数轻松访问系统注册表[01-03]
- 在VisualBasic中使用Rundll32.exe和Ru..[01-03]
- VB中的处理问题[01-03]
- 相关文章
