周报_2012第17周(2012/04/22-2012/04/28)

2012.04.28

复杂问题研究:升级shell扩展com库

explorer根据guid区分不同的com库

explorer不重新启动则始终在其内存中驻留旧的com库程序

rgs注册表项为com库的调用方入口

explorer使用相同的旧的guid(新升级版本的rgs注册表项)调用其内存中驻留的旧com库,崩溃的是旧dll库,与新dll库无关,所以新增调用接口无法兼容预防旧程序崩溃。

explorer使用新guid与其内存中驻留的旧com库不匹配,不能调用程序,所以右键菜单扩展显示为空。

所以新增调用入口时防止旧com库崩溃的方法是[升级guid],结果为不显示右键菜单的shell扩展,explorer重新启动后将提升dll版本号(即加载新的guid库)加载新的com库程序。(应尽可能的在最初设计时完善调用入口 - 注册表项 ShellEx\ContextMenuHandlers)

 

覆盖原dll文件位置安装时(删除原dll并在相同位置粘贴新dll),explorer同时保存2个版本dll(包含已删除的原有dll),explorer使用新升级guid和新dll库匹配,但是explorer使用未提升的旧的dll版本号,不能加载。

删除原dll文件在新位置安装时,explorer使用新升级guid和新dll库匹配,并提升新dll版本号,正确加载shell扩展库。

posted @ 2012-04-28 23:28 DancingFish 阅读(...) 评论(...) 编辑 收藏