在 vb6 中填充组合框时出现运行时错误 0

Posted

技术标签:

【中文标题】在 vb6 中填充组合框时出现运行时错误 0【英文标题】:Run-time error 0 when populating a combo box in vb6 【发布时间】:2008-11-28 11:50:49 【问题描述】:

特定机器特有的奇怪错误...

我有一个应用程序,其中组合框的文本值设置为文档的路径(即...

cmbAIDFile.Text = clsTonyToolkit.GetSetting("ExportAIDFile",gtypmetadata.gcnnCentral) & ""

忘记所有的 GetSetting 过程等,只要它返回一行文本并且工作正常。

这在除一台机器之外的所有机器上都能正常工作。这台特定的 Vista 机器抛出错误 Run-time error 0 并将用户抛出程序,而不管过程中的 ErrorHandling 是什么。其他 Vista 机器工作正常。

我们将不胜感激地收到对这个令人困惑的问题的任何答案。


感谢您的帮助。

机器正在运行 Vista Business 64 位。

用户可以通过打开的用户帐户控制获得管理员权限。

按照您的提示,我尝试以管理员身份运行该应用程序并得到各种奇怪的响应(缺少文件、未注册的依赖项等)。已卸载该应用程序并将尝试重新安装。我认为文件夹的卷影副本也可能令人困惑。

【问题讨论】:

我发现它也可以使用文本框,但只是这台机器。 您确定问题不在 GetSettings 中吗?您可以尝试将函数的结果添加到临时变量中以找出导致问题的原因。 是的,试过了。 GetSettings 没问题。 【参考方案1】:

您可能在错误的位置寻找错误。当您更改ComboBoxText 属性时,如果新文本与以前的文本不同,则ComboBoxChange 事件将触发。 LostFocus 和/或 Validate 事件也可能会触发,具体取决于您的代码正在执行的操作以及表单的设置方式。

如果在Change 事件处理程序(或LostFocusValidate 事件处理程序,如果您正在使用它们)中发生错误,则更改组合框文本的代码中的错误处理代码永远不会被调用(这与错误处理和事件在 VB6 中的工作方式有关)。

作为一般规则,您应该始终在您的 VB6 代码中的每个例程(子、函数或属性)中放置一个错误处理程序,因为否则您永远无法确定是否会捕获每个错误。

这是一个简单的示例,它展示了错误处理可能并不总是像您认为的那样在 VB6 中发挥作用。

新建一个标准EXE工程,在默认窗体中添加一个CommandButton(Command1)和一个ComboBox(Combo1),在窗体中添加如下代码:

Private Sub Combo1_Change()

   Dim a As Long
   a = 1/0 '<-- this will cause a divide-by-zero runtime error'

End Sub

Private Sub Command1_Click()

    On Error GoTo MyErrorHandler

    'Change the combobox text.'
    'This will cause the Change event to fire' 

    Combo1.Text = "test"

    Exit Sub

MyErrorHandler:
    'This code will not be executed if an error occurs in Combo1_Change...'
    MsgBox "My error-handler called."

End Sub

如果您编译项目并运行生成的 EXE,则无论何时单击 Command1 都会出现运行时错误,并且程序将终止。这是因为添加的错误处理代码(示例中为MyErrorHandler)没有被调用。但是,如果您将错误处理代码添加到Combo1_Change 事件处理程序,您可以捕获错误并尝试处理它(至少可以防止程序崩溃)。

因此,我会确保每个事件过程中都有错误处理代码,如果缺少则添加它。这应该可以更容易地查明错误实际发生的位置。例如,如果您在cmbAIDFile_Change 事件过程中有代码,请确保它具有错误处理功能。我也会在您的代码中添加行号(如果您还没有):这样您就可以在错误处理代码中使用Erl 来获取发生错误的实际行号。有关如何在错误消息中记录行号的示例,请参见以下代码。

使用 Erl 报告错误消息中的行号

Private Sub cmbAIDFile_Change()

1000   On Error Goto ErrorHandler

1010   DoSomething
1020   DoSomethingElse

ErrorHandler:

1030   Dim sErrMsg As String
       sErrMsg = "A fatal error occurred." & vbCrLf & vbCrLf  & _
                 "Method: cmbAIDFile_Change" & vbCrLf & _
                 "Line: " & Erl & vbCrLf & _ 
                 "Err.Number: " & Err.Number & vbCrLf & _
                 "Err.Description: " & Err.Description

1040   MsgBox sErrMsg, vbCritical+vbOKOnly, "Fatal error"

End Sub 

一旦你有了更细粒度的错误处理,你就可以开始调查为什么你只在一台机器上看到了问题,因为你应该有关于正在发生的错误的更可靠的信息,并且在一个更好的位置来确定根本原因是什么。

【讨论】:

这种行为在所有机器上是否都相同,因为它是 VB6 中的一个已知问题? (我进行了测试以确认。)这并不能解释为什么 Ton'y 只在一台机器上看到问题。 @Jeff:你是对的,它没有,但它可能会帮助他找到在 Vista 上实际失败的代码行。他正在查看更改 Text 属性的代码行;但是,我打赌代码在某处的事件处理程序中出错了...... 我在回答中的建议是,他将错误处理添加到他可能拥有的任何事件处理程序中,这样他就可以在更接近实际发生的位置捕获错误。我们看不到的代码可能正在做很多事情,这些事情可能在一台机器上而不是另一台机器上失败...... @Mike:我从版本 3 开始就使用 VB,并且一直没有遇到过这种情况,这就是为什么我必须运行你的代码示例才能相信它。我想我总是为我的所有事件提供事件处理程序。这是 MSFT 的一次重大失误。令人惊讶的是,这种行为仍然存在。 在组合框的 Change 事件中确实有一些代码,该代码为配置表单上的控件执行各种工作。我提供的代码发生在 form_load 事件中,我怀疑并非所有控件都已初始化。【参考方案2】:

vista机器有什么区别?

版本 设置 用户权限

AI 会影响应用程序的工作方式。

【讨论】:

【参考方案3】:

Mike Spears 的建议是正确的,因为您需要将错误处理程序放入所有事件中,因为将字符串分配给组合框的文本会导致许多事件触发。

我的贡献是尝试以下。

Dim TempS as String
TempS = clsTonyToolkit.GetSetting("ExportAIDFile",gtypmetadata.gcnnCentral) & ""
cmbAIDFile.Text = TempS

Unicode 可能会发生一些奇怪的事情。这由错误 0“无效的过程调用或参数”指示,否则为正常分配。同样,如果您有 cmbAIDfile 的事件过程,那么您需要捕获它们,以便查看那里是否发生错误。

【讨论】:

【参考方案4】:

使用这些代码

Private Sub Command1_Click()
    On Error Resume Next
        'Your combo-box code here
    On Error GoTo 0
End Sub

【讨论】:

以上是关于在 vb6 中填充组合框时出现运行时错误 0的主要内容,如果未能解决你的问题,请参考以下文章

从逆序 C++ 访问向量时出现运行时错误 [关闭]

安装VB6 - 无法创建DCO M用户帐户时出错

如果未提供位置,则在报告错误时必须提供节点。运行 ESLint 7.11.0 时出现 no-unused-vars 错误

在运行SQL时出现错误,请问如何解决?

为啥运行 yarn start 时出现语法错误

运行独立的pyspark时出现Windows错误