编写可复用性更好的C++代码:Band对象和COMToys(9)
2006-07-21 11:45:59 来源:WEB开发网做完以上的事情,你就可以使用COMToys来编写COM对象了,用它编写倾向于ATL的COM对象,或者比ATL还要ATL。COMToys模型有两层:基础层独立于MFC,较高层的类使用MFC。我进行这种分层不是没有道理,它确实必要。如果有时间我会为此再写一篇专题文章。
来自黑洞恐怖的奇闻轶事
没有哪一个项目是顺顺利利完成而不经历波折与磨难,COMToys也一样。它发生在我测试注册代码的时候,我注意到在调用ResourceUnregister时,IRegistrar没有完全删除该删除的东西。我猜测它是出于安全起见才这么做的。于是我决定加几行代码在注销类的同时删除HKCR\CLSID\clsid。我查到MFC中有一个现成的函数来做这件事情:AfxOleUnregisterClass。这个函数有两个参数,一个是某个类的ID,另一个是ProgID。于是我加上了这一行代码:
AfxOleUnregisterClass(m_clsid, GetProgID());
为了测试我的代码,我运行regsvr32.exe /u,然后运行REGEDIT去看注册表,按F5刷新,显示结果如图二十。看到没有!HKEY_CLASSES_ROOT已经全部展开。我的整个HKEY_CLASSES_ROOT不见了,只剩下空空如也的CLSID键。
图二十 啊!我的注册表键值到哪去了?
怎么会这样啊;一定是REGEDIT搞错了。我退出REGEDIT并从"开始"菜单中重新运行REGEDIT,结果给我显示出一个小对话框。"这个程序引用了一个不存在的lnk文件……",这些信息看似无所谓,但实际上我面临的形势严峻。我桌面上的东西不翼而飞。资源管理器失踪了?IE也没了?每个图标被替换成莫名其妙的图标。我甚至不能启动MS-DOS窗口。我气得恼羞成怒,差点把显示器砸了。只好重启机器。但很不幸,我被欺骗了。MFC把整个注册表删掉了。我沮丧地望着屏幕无可奈何,想着最后一次备份是在什么时候......
更多精彩
赞助商链接