2011-09-03 151 views
3

我有一个VB6应用程序,安装程序使用INNO Setup进行编译。 安装程序运行良好。但在大约10%的计算机上,当用户单击图标运行已安装的应用程序时,它不会启动,也不会出现错误信息,只会发出哔声。VB6应用程序不会在某些计算机上运行,​​在其他计算机上运行良好

这是发生在XP和也赢得7

我在XP和Win 7的开发和应用工程确定,所以我一直无法重现该问题。

安装程序注册所有需要的ocx和dll(afaik)。 (好吧不是全部,它假设MS运行时组件应该在那里,但我想如果缺少某些东西应该显示一条错误消息)

我在想某种用户权限,UAC,但甚至用户管理员组有问题。

您能否指出我需要寻找和测试哪些可能的问题以修补应用程序。

谢谢!

[后续]

多亏了提示,发现了明显的原因造成的问题。我用它来作对照更好看:

http://www.vbaccelerator.com/home/vb/code/libraries/xp_visual_styles/using_xp_visual_styles_in_vb/article.asp

现在我试图发现为什么。我有另一个具有相同清单的应用程序,并且工作正常。

尚未能在事件查看器上获得反馈。

+0

您需要确保所有依赖项都在目标计算机上。您是否尝试过在事件查看器中查看是否记录了错误?我以前遇到过MCI ocx的问题。 –

+0

应用程序是否为ActiveX EXE? – wqw

+0

wqw:不,不是ActiveX Exe。 – Sunjen

回答

3

“嘟嘟声崩溃”通常指向应用程序清单中的错误,如XML语法错误或namspace冲突。事件日志通常会提供一个提示。

但我发现人们经常尝试使用Common Controls 6.0 Library,但没有确保正确的库加载顺序。

在任何窗体打开之前,您应该先载入shell32,然后载入comctl32。最简单的方法是一对夫妇在子主空操作呼叫:

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控件。

+0

嗯..你让我想到了清单xml。告诉客户重命名“app.exe.manifest”文件,并尝试,等待结果:) – Sunjen

+0

是的重命名或删除“app.exe.manifest”文件后它再次工作!调试.. – Sunjen

2

有几件事情要尽量缩小范围:

检查Windows事件日志中的碰撞事件

检查Windows事件日志(在应用部分)从崩溃报告你应用。您可以通过点击开始>运行,输入eventvwr并按输入,快速进入Windows XP上的日志查看器。在Windows 7上,您可以在开始菜单中的搜索框中键入“事件查看器”。您可以过滤事件以仅显示程序中的错误事件。

您可能在其中一台出现此问题的计算机上发现了一些错误事件,因为它听起来像是在这些计算机上关闭了错误报告功能(在这种情况下会记录访问冲突等“硬崩溃”在事件日志中,而不是向最终用户显示错误对话框,只要调试器未安装在计算机上)。

确保“错误报告”在操作系统级开启

正如前面所提到的,这听起来像报告功能错误关闭这些计算机上。在这种情况下,崩溃不会向终端用户显示任何类型的消息,应用程序将突然消失。在Windows XP中,你可以检查此设置(并打开)如下:

  1. 右键单击“我的电脑”,选择属性
  2. 打开高级选项卡并单击错误报告按钮。
  3. 选择启用错误报告选项。
  4. 点击确定到所有打开的窗口。

添加跟踪代码添加到您的应用程序

你也可以添加一些跟踪代码添加到您的应用程序的启动代码,如代码以显示一个消息框或写邮件到Windows事件日志或者在应用程序启动后(例如,在主窗体的Form_Initialize事件或Sub Main例程中),将其保存到日志文件中。

通过这种方式,您将能够判断应用程序是在加载VB6运行时之前还是之后崩溃:如果您尝试启动应用程序并且它消失/崩溃,并且启动消息未记录,那么您在它甚至有机会到达您的应用程序的启动代码之前,它知道它崩溃了,这可能表明VB6运行时的依赖关系或VB6运行时本身没有正确安装。

请注意,Windows XP和Windows 7都预装了VB6运行时,但它可能会导致行为异常的安装程序覆盖或删除属于VB6运行时的文件。

+2

此外,如果您在代码中放置了任何“On Error Resume Next”语句,我现在将它们评论出来。他们有一种隐藏你所有有用的错误信息的方法。 – feathj

+0

@jonfen:很好的电话。这完全滑了我的脑海。 –

+0

很棒,检查你的提示 – Sunjen

相关问题