我有一个VB6应用程序,我提供支持。此应用程序适用于Windows XP和Windows 7.某些用户使用用户状态迁移工具从Windows XP迁移到Windows 7。这些用户现在在应用程序中打开某些屏幕(表单)时会收到一个通用的“应用程序崩溃”Windows错误消息。我的假设是缺少dll / ocx引用,但是我无法跟踪它。
我尝试了很多/不同的故障排除技术:
MousePointer = vbHourGlass
的行上...对我而言,这似乎不太可能是错误的真正原因。程序中至少有20个其他位置调用同一行,并且一切正常。
(忘了这个)这些操作都没有更改我的错误消息或显示错误是什么(除非它确实是鼠标光标问题)... Windows事件日志中没有与应用程序崩溃相关的条目。
非工作和工作的计算机都具有相同的基本Windows 7映像,唯一的区别是USMT正在更改的内容,这进一步说服我这是某种奇怪的配置更改或缺少dll / ocx或也许是未注册的dll / ocx。
我将非常感谢任何有关如何追查问题根源的想法或想法。
更新1 - 回答问题
@MarkHall我已尝试以管理员身份运行它,但不是关闭UAC。该应用程序在Windows 7机箱上运行良好,作为非管理员使用完整的UAC。 Windows XP是32位,Windows 7是64位,但它再次适用于类似于用户未从Windows XP迁移的类似框。
@Baaner它可能会将设置存储在已损坏的地方,但是远程调试让我认为它更可能是其他东西,因为它似乎死于与UI相关的步骤,这让我觉得它是可能缺少dll / ocx参考。
@ Bob77该应用程序已安装到Program Files (x86)
中。虽然许多库都位于同一个文件夹中,但它们都已注册。
答案 0 :(得分:2)
Peter,我经常注意到调试器会指示一行实际上不正确的代码,具体取决于发生故障的实际汇编语言中的WHERE。您应该在将语句设置为vbHourGlass
的语句旁边看起来很接近。您的例外是在该行代码之前发生的,但该行是调试器认为是实际出现故障的代码行。
因为你说它发生在一个窗口OPENS时,我看起来真的很接近你可能在表单上引用的任何ocx,但可能实际上并没有被使用或被调用。你可能有一个你不打算在那里,可能会导致安全问题,或Win7上的东西?如果必要,手动编辑.frm文件,并查看表单引用的所有GUID。
一台机器可能正在使用PER-USER注册,而另一台机器正在使用PER-SYSTEM注册?我不知道......
我会仔细查看您尝试打开的表单,并非常谨慎地处理表单加载事件中的所有操作,依此类推。这听起来像是一个愚蠢的东西,如在一个系统上启用Windows Aero,而不是另一个,或其他一些“主题”设置,将VB表单渲染例程抛入一个hissyfit ...也许甚至像愚蠢的东西作为您选择的图标中的透明颜色索引?
如果您仍在开发此应用程序(或至少维护它),请创建一个完全新的表单,并在表单上重新创建所有控件等(抵制从旧版本复制/粘贴它们的诱惑一个...),然后看看是否有诀窍。然后,将所有事件代码一次复制到新表单一个事件,使用至少足够的事件代码来创建表单函数,即使它只是一个“死表单”,不加载任何数据,或者不管表单是什么形式去做。每次更改后检查并调试,最终会找到它。当然,请确保您将其中一个已解散的系统隔离开来,以便拥有一个可以复制问题的平台,或者只是猜测它。我发现使用Acronis w / Universal Restore之类的东西是一个很好的选择,然后将图像文件转换为一个好的HV,如VirtualBox,然后将该图像恢复为VM,这样您就可以调试而不会干扰您的实际用户。这听起来像是很多工作,但是又重新编写了一个已经存在的应用程序,对吧? :)
失败...... /*
和*/
是你的朋友! (好吧,我们正在处理VB,所以'
将是你最好的朋友!嘿......但是我开始评论表单上的所有代码,直到那个sucker打开。然后一旦它打开,就开始一次放回一行,并重新运行它...这叫做“VooDoo调试”,但有时,你必须做你必须做的事情......
感谢很多彼得! :)现在你有 ME 这么参与其中,我觉得我是调试这个傻逼的人!就像是我的代码,我试图解决! :)
如果有任何帮助,请告诉我......我实际上对您发现的内容非常感兴趣。