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扩展库。