VB6 IDE缓慢和注册表中的'VBKeySave5'

Dav*_*Caz 0 ide vb6 registry

什么是注册表子树HKCR\VBKeySave5?为什么它对VB6 IDE性能有如此巨大的影响?

背景:

我们的一台开发PC(Windows 10 x64)加载VB6 IDE非常慢.IDE最初加载速度很慢,而且启动项目引用窗口的速度很慢.(几十秒,甚至几分钟).

清除项目使用的库之一的注册表显示了子树HKCR\VBKeySave5.在这个子树下有成千上万的条目,看起来像你用VB6 DLL等获得的GUID,类ID,类名等通常的COM沼泽地.

删除此密钥及其下的所有内容使IDE执行速度更快 - 基本上它会加载然后立即显示引用窗口.

由于这一点,似乎没有发生任何坏事.

Dav*_*Caz 6

VBKeySave5\当在组中运行多个项目时,VB6 IDE 似乎使用子树.

当在组中运行时,VB6巧妙地使通常从已编译的DLL提供的所有COM引用实际上重定向到IDE,因此您可以直接调试到同一组中的项目.它似乎使用VBKeySave5\子树来实现一些这种魔法.

我做了一个包含一个测试DLL的测试项目.然后做了一个包含两者的测试组.使用Process Monitor我查看了IDE在注册表中所做的事情.这是事件的基本顺序:

  1. 加载项目组
  2. 运行项目组 - 调试开始
  3. IDE创建VBKeySave5\子树
  4. IDE用一堆东西填充该子树
  5. 测试程序在IDE /调试器中执行
  6. 测试程序终止
  7. IDE将删除所有内容 VBKeySave5\
  8. IDE返回编辑模式(调试结束)

在那种情况下,注册表中没有任何额外的内容.

现在 - 如果在第5步之后我杀死了VB6.exe进程,它添加的所有注册表垃圾都不会被删除.并再次运行VB6并运行相同的组不会清理它 - 它只是创建稍微不同的东西VBKeySave5\.

因此,随着时间的推移,特别是对于较大的项目,当IDE终止异常时,会向注册表添加大量无用的混乱.并且看起来这个混乱仍然需要在加载项目时由IDE读取,等等.

在我们的例子中,无论出于何种原因,IDE崩溃了很多.我们定期使用项目组(有4个,5个,6个项目).因此看起来这些崩溃VBKeySave5\会导致大量条目崩溃,导致速度减慢.

也许除了崩溃之外还有其他情况,VB6不会自行清理.


2017年2月20日更新: 有关为什么VBKeySave5可能无法自动清除的其他信息:

VS Installer for Windows 10允许您将VB6.EXE兼容模式设置为Windows Vista(Service Pack 2).

不要这样做.

不要在任何类型的兼容模式下运行VB6 IDE.建议的目的是修复IDE的图形设计器中的异常.相信我,这些异常与VB6.EXE在兼容模式下运行时在Windows注册表中留下的损坏相比毫无意义.

当VB6.EXE用于编译并运行您的应用程序时,它会替换GUID,类和类型库注册,从而导致它们引用其VB6DEBUG.DLL.这允许IDE拦截代码的执行,以便您可以进行调试.当它替换你的DLL和OCX注册时,它会将你的东西保存在HKCR\VBKeySave5下.不幸的是,当VB6.EXE设置为在早期版本的Windows的兼容模式下运行时,它无法恢复所有DLL和OCX注册信息.它将VBKeySave5留在那里,这会导致IDE在IDE的后续启动期间花费更长的时间,并且它会破坏您的注册表,最终导致您的应用程序无法在您的计算机上运行.