我有一个旧的 VB6 应用程序,它使用 COMCTL32.OCX 中的 ImageList 控件(“Microsoft Windows Common Controls 5.0 (SP2)”)为 TreeViews 和 ListViews 提供图标。
该应用程序甚至无法在 Windows 7.0 64 位上启动。它尝试加载具有 ImageList 的表单的那一刻,它崩溃了(实际上,应用程序眨眼,退出而无影无踪)。
从表单中删除 ImageList 可以解决问题。
有任何想法吗?
我通过将 VB5 附带的所有 COMCTL32.OCX 实例替换为 VB6 附带的 MSCOMCTL.OCX 解决了这个问题。
Microsoft 知识库文章190952提供了执行此操作的说明。这几乎只是一个全局搜索和替换操作。
向 Microsoft 报告错误。VB6 运行时在 64 位 Windows 7 上仍受支持。COMCTL32.ocx 未随 Windows 7 一起安装,但在 Windows 7 上被明确列为受支持。
你的解决方案没问题。但是 COMCTL32.OCX 在 Win64 上应该可以正常工作(Vista 或 7)。
只是一点建议:
如果使用 MSCOMCTL.OCX,您将无法将 XP/Vista/7 样式应用于您的列表视图或树视图,并且您的应用程序可能看起来很陌生。清单不会对 MSCOMCTL.OCX 控件产生任何影响。
一种解决方法是对 MSCOMCTL.OCX 控件进行子类化,并且由于它们仍然包含 COMCTL32.DLL 标头,因此您可以操纵它的绘制方式。
(我会作为评论发布,但我仍然不能)
一个不太激烈的 DEP 调整是进入计算机性能对话框(系统属性的高级选项卡)并将应用程序 exe 添加到 DEP 选项卡上的例外列表中。
顺便说一句,你确定这不属于 serverfault.com。:P
您可能会遇到数据执行保护 (DEP) 的问题。通过禁用 DEP 进行测试:
bcdedit.exe /set {current} nx AlwaysOff
在命令行中输入以上内容后重新启动。请记住将其重新打开,因为它相当于脱下裤子运行 Windows。
编辑:上面的命令适用于 Vista。我还没有在 Windows 7 上尝试过。