我有一个VB6应用程序,使用INNO Setup编译安装程序。 安装程序运行正常。但是在大约10%的计算机中,当用户单击Icon运行已安装的应用程序时,它无法启动,没有错误消息,只有哔声。
这发生在XP和Win 7上。
我在XP和Win 7中开发,应用程序运行正常,所以我无法重现这个问题。
安装程序会注册所需的所有ocx和dll(afaik)。 (好吧不是全部,它假设MS运行时组件应该在那里,但我想如果缺少某些东西就会出现错误消息)
我在想某种用户权限,UAC,但即使管理员组中的用户也遇到了这个问题。
您能否指出我需要寻找和测试哪些问题才能修补应用。
谢谢!
[关注]
感谢提示,发现清单导致了问题。我用它来使控件看起来更好:
现在我正试图找出原因。我有另一个具有相同清单的应用程序,并且一个正常。
尚未获得有关事件查看器的反馈。
答案 0 :(得分:3)
“beep crash”通常指向应用程序清单中的错误,例如XML语法错误或namspace冲突。事件日志通常会提供相关信息。
但我发现人们经常尝试使用Common Controls 6.0 Library而不确保正确的库加载顺序。
在开启任何表单之前,您应该加载shell32,然后加载comctl32。最简单的方法是在Sub Main中进行几次无操作调用:
Option Explicit
Private Declare Sub InitCommonControls Lib "comctl32" ()
Private Declare Function IsUserAnAdmin Lib "shell32" () As Long
Private Sub InitCommonControlsVB()
IsUserAnAdmin
InitCommonControls
End Sub
Private Sub Main()
InitCommonControlsVB
Form1.Show
End Sub
如果没有这个,你的程序通常可以在Vista或Win7中正常运行,但在某些XP服务包和补丁级别上会失败。部分原因是由于处理SxS激活和comctl32.dll补丁的Fusion子系统随时间发生了变化。
忽略那些说你需要调用InitCommonControlsEx()的人,除非你直接构造和使用Win32控件而不是VB6和COM控件,否则没有必要。
答案 1 :(得分:2)
尝试缩小范围的一些事情:
检查Windows事件日志中的崩溃事件
检查Windows事件日志(在应用程序部分中),查看应用程序的崩溃报告。您可以通过单击开始>快速访问Windows XP上的日志查看器。 运行,输入eventvwr
并按 Enter 。在Windows 7上,您可以在开始菜单中的搜索框中键入“事件查看器”。您可以过滤事件以仅显示程序中的错误事件。
您可能会在其中一个已经出现此问题的计算机上发现一些错误事件,因为听起来这些计算机上的错误报告功能已关闭(在这种情况下会记录“硬崩溃”,例如访问冲突)事件日志,而不是向最终用户显示错误对话框,只要计算机上没有安装调试器。)
确保在操作系统级别启用“错误报告”
如上一节所述,听起来这些计算机上的错误报告功能已关闭。在这种情况下,崩溃根本不会向最终用户显示任何类型的消息,应用程序将突然消失。在Windows XP中,您可以按如下方式检查此设置(并将其打开):
向您的应用添加跟踪代码
您还可以向应用程序的启动代码添加一些跟踪代码,例如显示消息框的代码,或者在应用程序启动后立即将消息写入Windows事件日志或日志文件(例如,在主表单的Form_Initialize
事件中,或在Sub Main
例程中。
通过这种方式,您可以在加载VB6运行时之前或之后判断应用程序是否崩溃:如果您尝试启动应用程序并且它消失/崩溃,并且您的启动消息未被记录,那么您就知道了它甚至有机会到达你的应用程序的启动代码之前崩溃,这可能表明VB6运行时或VB6运行时本身的依赖关系没有正确安装。
请注意,Windows XP和Windows 7都预装了VB6运行时,但行为不当的安装程序可能会覆盖或删除属于VB6运行时的文件。