编写可复用性更好的C++代码:Band对象和COMToys(9)
2006-07-21 11:45:59 来源:WEB开发网幸运的是我用一个买来的程序每天都自动备份注册表。但lnk文件都没了怎么运行呢?终于我还能从"开始"菜单中到"运行"窗口,然后敲入command.com/cmd.exe打开外壳MS-DOS窗口。进到ConfigSafe目录并运行它将注册表恢复到前一天的配置。到这我才松了口气。
这件事情导致系统临近崩溃的边缘。后来Band对象不能插入,它们不需要ProgID。MyBands的注册表串没有ProgID,所以CTFactory::GetProgID自然返回空CString。注意是空empty,不是NULL。我将这个空串传到AfxOleUnregisterClass函数,它包含如下的代码行:
if (pszProgID != NULL)
_AfxRecursiveRegDeleteKey(HKEY_CLASSES_ROOT,
(LPTSTR)pszProgID);
我想不需要再做进一步解释了,函数名中的单词“recursive”说明了一切。MFC象傻子一样欣然地删除了HKEY_CLASSES_ROOT下的所有东西。微软的人会修复这个问题吗! 这次的经验证明,在操作注册表的时候,以下几点是一定要注意的:
1、 必须要小心谨慎,这一点怎么强调都不过分。
2、 如果程序中要处理注册表键,要针对NULL值和空串增加一些附加的安全检查代码。
3、 如果没有用某个程序每天备份注册表,那么现在就赶快备份吧,亡羊补牢,为时不晚。
4、 不要相信MFC。不要相信任何人。并且如果你有心脏病,那么就不要做程序员(开玩笑)。
总结
无论你是否决定在自己的程序中使用COMToys,我都希望你至少认识到使用ATL、MFC或任何其它从ATL/MFC继承的系统并不是绝对的。重要的是不要陷入任何一个系统的怪圈中,而要按照自己方式来使用它们。我就乐意将COMToys看成是带多继承的MFC,或者无模板的ATL。
我还希望你能明白,花点时间建立一点儿自己的编程平台或者说基础结构(COMToys包括执行类只有2400行左右的代码,)这样你可以极大地方便自己的C++ COM编程。宏,智能指针,跟踪——这些简单的工具对编程也大有帮助,使编程更加容易。最终的COMToys库源代码不可能在此全部列出,需要的话可以全部下载。总之,用COMToys来编写BandObj对象很简单,只需将一些预先做好的东西粘合在一起并加入你要的新特性。它的宗旨就是可重用性。不仅仅是在BandObj中使用,它也可用于其它的应用。今后还可以进一步实现IPersistStream接口以扩充更大的功能。 COMToys并不是十全十美,也没有哪个系统能做到。但COMToys在实践中运行良好,而且我用它建立了Band对象和一个快速的浏览文件的浏览器。今后我会不断完善COMToys,所以请关注最新开发动向和源代码。
最后祝大家编程愉快!
(全文完)
更多精彩
赞助商链接