VB6 Timer(), Space() Form_Initialize() 导致立即崩溃

Posted

技术标签:

【中文标题】VB6 Timer(), Space() Form_Initialize() 导致立即崩溃【英文标题】:VB6 Timer(), Space() Form_Initialize() causes Immediate Crash 【发布时间】:2012-01-19 12:18:30 【问题描述】:

创建一个新的 VB6 项目。粘贴下面的代码作为您的项目代码。点击运行。看看它是否崩溃...删除或简化此代码中您喜欢的任何内容,然后它会正常工作。 谁能解释一下为什么会崩溃?

到目前为止,这已经在八台 PC 上进行了测试,所有 PC 都运行 Windows XP、Windows Vista、Windows 7、Office 2010 和 Office 2007 的各种组合。在 Visual Basic IDE 中进行测试的是 Visual Basic 6 SP已安装 6 个。

Private Sub Sleep(ByVal nSeconds As Long)
    Dim nStart As Long: nStart = Timer
    Do
        DoEvents
    Loop Until (Timer - nStart) >= nSeconds
End Sub

Private Sub Crash()
    Dim sTempPath As String: sTempPath = Space(255)
End Sub

Private Sub Form_Initialize()
    Sleep 1
    Crash
End Sub

附录 #1:

我把它作为一个宏放在 Excel 2010 中,用 Workbook_Open() 替换 Form_Initialize(),果然,当你打开文档时。它崩溃了!

附录 #2:

我在点击“运行”之前为每一行添加了断点,它在到达第一个断点之前就崩溃了。但同样,如果我简化或删除其中的任何内容,它可以正常工作并且不会崩溃。

附录#3:

尝试了 MicSim 删除冒号的建议,它确实没有崩溃。添加回来,再次运行它,它确实没有崩溃。关闭Visual Basic,并输入原始代码,它就崩溃了。

附录#4:

Visual Basic 6 IDE 中的问题详细信息:

问题特征: 问题事件名称:APPCRASH 应用程序名称:VB6.EXE 应用程序版本:6.0.81.76 申请时间戳:3592011f 故障模块名称:VBA6.dll 故障模块版本:6.0.0.8169 故障模块时间戳:358b0c74 异常代码:c0000005 异常偏移量:00026329 操作系统版本:6.1.7601.2.1.0.256.4 区域设置 ID:1033 附加信息 1:7e3b 附加信息 2:7e3beb1e9ccf6d519c5b994ca59a280f 附加信息 3:7b83 附加信息 4:7b833c57ebcf54809fd3aaccd8ea4f46在线阅读我们的隐私声明:http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409 如果在线隐私声明不可用,请离线阅读我们的隐私声明: C:\Windows\system32\en-US\erofflps.txt

附录#5:

Microsoft Excel 2010 中的问题详细信息:

问题特征: 问题事件名称:APPCRASH 应用程序名称:EXCEL.EXE 应用程序版本:14.0.4756.1000 申请时间戳:4b9c08e8 故障模块名称:VBE7.DLL 故障模块版本:7.0.15.90 故障模块时间戳:4b7b1248 异常代码:c0000005 异常偏移量:00045b6a 操作系统版本:6.1.7601.2.1.0.256.4 区域设置 ID:1033有关问题的其他信息: 液晶显示器:1033 skulcid:1033在线阅读我们的隐私声明:http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409 如果在线隐私声明不可用,请离线阅读我们的隐私声明: C:\Windows\system32\en-US\erofflps.txt

【问题讨论】:

我在 VB6 SP6、Win 7 x64 SP1 上没有崩溃。 在我的 VB6 SP6 上工作。 32 位 XP SP3 机器。 你能说出它“崩溃”在哪一行吗?在您的睡眠和崩溃程序开始时设置一个断点,并逐步告诉我们您在哪一行看到了什么问题。 用 Excel 2010 尝试了你的建议,但它崩溃了。这是因为 Long 和 String 后面的冒号 (:)。把它去掉,做2行就OK了。制作 2 行但将结肠留在那里仍然会导致崩溃。无法告诉你为什么。 @druciferre:既然你有解决方案,不用担心它为什么不起作用。继续做更重要的事情。不要浪费时间去猜测为什么某些 Microsoft 产品不起作用。所有产品都可能有错误,包括 IDE 和编译器。 【参考方案1】:

在查看了您的问题和所有附录后,我意识到您的计算机运行的是 VB6 的发行版,而不是 SP6。

您的崩溃详细信息表明以下版本:

VB6.exe: 6.0.81.76 VBA6.dll:6.0.0.8179

Visual Basic 6.0 SP6 文件的确切内部版本号如下:

VB6.exe: 6.0.97.82 VBA6.dll:6.0.0.9782

异常代码 c0000005 对应于模块 vba6.dll 中的访问冲突。类似的问题记录在Microsoft KB

我还没有找到每个 VB6 服务包的准确源代码列表,但看起来这是RTM version。即使您自己安装了 SP6,恶意安装程序也可能在安装 Service Pack 后被旧版本覆盖了共享系统文件。这可以解释为什么很多用户评论说代码在看似相似的设置下运行良好。

【讨论】:

所以,很明显,编译器失败是因为安装不正确。 我不太确定这是不是问题,正如我所说,这也发生在使用 VB7.dll(版本 7.0.15.90)的 Microsoft Excel 2010 中。 尝试重新安装 VB6 并更新到 SP6,看看是否能解决问题。它不会解释 Excel 部分,但至少您可以确认或拒绝在带有 SP6 的 VB6 中它是固定的。

以上是关于VB6 Timer(), Space() Form_Initialize() 导致立即崩溃的主要内容,如果未能解决你的问题,请参考以下文章

VB6中如何获得指定进程名称

想用VB6.0做一个小程序,里面就一张图片,打开10秒后自动关闭.求详细制作方法,还有所需要的控件,属性设置

Vb6:通过浏览按钮选择稍后使用的文件

vb6.0中所有字符输入之间的距离

wpf不能使用win form的timer控件怎么办

使用窗口句柄作为 VB6 窗体的所有者