使用VB6应用程序中的ImageList会导致Windows 7.0 64位系统崩溃

使用VB6应用程序中的ImageList会导致Windows 7.0 64位系统崩溃,vb6,listview,treeview,win64,imagelist,Vb6,Listview,Treeview,Win64,Imagelist,我有一个旧的VB6应用程序,它使用COMCTL32.OCX(“Microsoft Windows Common Controls 5.0(SP2)”)中的ImageList控件为树视图和列表视图提供图标 该应用甚至不会在64位Windows 7.0上启动。当它试图加载带有ImageList的表单时,它崩溃了(实际上,应用程序会闪烁,退出时没有任何痕迹) 从表单中删除ImageList可以解决此问题 有什么想法吗?您可能遇到了数据执行保护(DEP)问题。通过禁用DEP进行测试: bcdedit.e

我有一个旧的VB6应用程序,它使用COMCTL32.OCX(“Microsoft Windows Common Controls 5.0(SP2)”)中的ImageList控件为树视图和列表视图提供图标

该应用甚至不会在64位Windows 7.0上启动。当它试图加载带有ImageList的表单时,它崩溃了(实际上,应用程序会闪烁,退出时没有任何痕迹)

从表单中删除ImageList可以解决此问题


有什么想法吗?

您可能遇到了数据执行保护(DEP)问题。通过禁用DEP进行测试:

bcdedit.exe /set {current} nx AlwaysOff
在命令行中输入上述命令后重新启动。记住重新打开它,因为它相当于穿着裤子跑窗户


编辑:上面的命令适用于Vista。我还没有在Windows 7上尝试过它。

一个不太激烈的DEP调整是进入“计算机性能”对话框(系统属性的“高级”选项卡),并将应用程序exe添加到“DEP”选项卡上的异常列表中


顺便说一句,您确定这不属于serverfault.com:P

向Microsoft报告错误。VB6运行时在64位Windows 7上。COMCTL32.ocx未随Windows 7一起安装,但它在Windows 7上受支持

我解决了这个问题,用VB6附带的MSCOMCTL.OCX替换了VB5附带的COMCTL32.OCX的所有实例

Microsoft知识库文章提供了执行此操作的说明。这几乎只是一个全局搜索和替换操作。

您的解决方案还可以。 但无论如何,COMCTL32.OCX在Win64(Vista或7)上都应该可以正常工作

只是一个小小的建议:

如果使用MSCOMCTL.OCX,您将无法将XP/Vista/7样式应用于listview或treeview,并且您的应用程序可能看起来很陌生。清单不会对MSCOMCTL.OCX控件产生任何影响

解决方法是将MSCOMCTL.OCX控件子类化,因为它们仍然包含一个COMCTL32.DLL头,所以您可以操纵它的绘制方式


(我本想发表评论,但我仍然不能)

除了向微软报告之外,我什么都不知道。第二,也许可以通过证明单幅图像的有效性来缩小范围。+1是的,听起来像是经典的DEP,绝对是第一个停靠港。