如何修复 Bug with For Each enumeration on x64 Custom Classes …

スポンサーリンク

Bug with For Each enumeration on x64 Custom Classes 的解决方案

错误概述

在使用 x64 平台的自定义类进行 For Each 枚举时,可能会遇到错误信息“Bug with For Each enumeration on x64 Custom Classes”。该错误通常发生在使用 VBA (Visual Basic for Applications) 进行开发时,尤其是在处理自定义集合类时。此错误会导致程序在进行枚举操作时崩溃或返回意外的结果。

常见原因

产生此错误的原因主要包括以下几点:

  1. 内存管理问题:在 x64 环境中,内存管理与 32 位环境存在差异,可能导致指针问题。
  2. 自定义集合实现不当:如果自定义集合类的 NewEnum 方法未正确实现,可能导致枚举操作失败。
  3. 不兼容的对象类型:在 x64 平台上使用不兼容的对象类型可能导致运行时错误。
  4. 缺少必要的属性定义:自定义类的属性如 VB_GlobalNameSpaceVB_Creatable 未正确设置。
  5. VBA 版本问题:使用的 VBA 版本可能存在已知的 Bug,尤其是在 x64 系统上。

解决方法

为了解决“Bug with For Each enumeration on x64 Custom Classes”错误,以下是几种推荐的方法:

方法 1: 正确实现 NewEnum 方法

确保在自定义集合类中正确实现 NewEnum 方法。以下是一个示例代码:

Option Explicit

Private m_coll As Collection

Private Sub Class_Initialize()
    Set m_coll = New Collection
End Sub

Private Sub Class_Terminate()
    Set m_coll = Nothing
End Sub

Public Sub Add(v As Variant)
    m_coll.Add v
End Sub

Public Function NewEnum() As IEnumVARIANT
    Attribute NewEnum.VB_UserMemId = -4
    Set NewEnum = m_coll.[_NewEnum]
End Function

方法 2: 增加 Debug 信息

为了更好地调试问题,可以在 NewEnum 方法中添加 Debug 输出,记录返回地址:

Public Function NewEnum() As IEnumVARIANT
    Attribute NewEnum.VB_UserMemId = -4
    Debug.Print "The NewEnum return address " & VarPtr(NewEnum) & " should be outside of the"
    Set NewEnum = m_coll.[_NewEnum]
End Function

方法 3: 使用示例代码测试

下面是一个完整的测试代码示例,可以用来测试自定义集合:

Sub Main()
    #If Win64 Then
        Dim c As New CustomCollection
        c.Add 1
        c.Add 2
        ShowBug c
    #Else
        MsgBox "This bug does not occur on 32 bits!", vbInformation, "Cancelled"
    #End If
End Sub

Sub ShowBug(ByRef c As CustomCollection)
    Dim v As Variant
    For Each v In c
        Debug.Print v
    Next v
End Sub

预防提示

为了避免在未来遇到类似的错误,可以采取以下预防措施:

  • 定期更新 VBA 和 Office 的版本,确保使用最新的补丁。
  • 在开发新功能时,注意遵循最佳实践,特别是在涉及内存管理的部分。
  • 在代码中添加足够的 Debug 信息,以便于快速定位问题。
  • 在 x64 环境下进行充分的测试,确保所有自定义类都能正常工作。

总结

本文讨论了“Bug with For Each enumeration on x64 Custom Classes”错误的常见原因及解决方法。确保在自定义集合类中正确实现 NewEnum 方法,并使用 Debug 输出帮助定位问题。此外,定期更新软件和遵循开发最佳实践可以有效预防此类错误的发生。通过这些方法,开发者可以在 x64 平台上顺利使用自定义类进行开发。

コメント

タイトルとURLをコピーしました