编写可复用性更好的C++代码:Band对象和COMToys(4)
2006-07-21 11:46:12 来源:WEB开发网当你第一次创建桌面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程序安装(这就是所谓的超人力量,不过如此!)或删除下面的这个注册表键:
HKEY_CLASSES_ROOT\Component Categories\ {00021492-0000-0000-C000-000000000046}\Enum,它是一个缓冲。({00021492...}是指CATID_DeskBand)。我修改了BandObj.rgs文件内容,总是删除这个键值。问题解决了。但是仍然要重启外壳让Windows产生新的种类缓冲。
接下来是一串关联的问题,它们都是由一个相同的bug导致的。这个问题就是:无论我什么时候编译源代码,总是出现"不能用写方式打开MyBands.dll"。很明显,只要资源管理器在运行,它就总是保持Band对象处于活动状态。IE也一样:当用户隐藏或显示Band时,IE调用IDockingWindow::HideDW 和ShowDW。IE不会释放这个对象,直到它退出。对于桌面Band来说,这意味着你必须要再一次用Ctrl-Alt-Del来杀掉它,然后重新建立,很讨厌,但那是没有办法的事。
更多精彩
赞助商链接