2

次の例には、2 つのクラスと 1 つの通常の 3 つの VBA モジュールが含まれています。RubberDuck VBA テストを実行してから Excel を閉じようとすると、CPU を積極的に使用している間に Excel がハングします。テストを 1 回実行しても毎回この問題が再現されるわけではありませんが、少なくとも 2 回実行すると、毎回問題が再現されるようです。


RDVBA バージョン 2.5.2.5871
OS: Microsoft Windows NT 6.2.9200.0、x64

テスト環境 1:
ホスト 製品: Microsoft Office XP x86
ホスト バージョン: 10.0.6501
ホスト実行可能ファイル: EXCEL.EXE

テスト環境 2:
ホスト製品: Microsoft Office 2016 x64
ホスト バージョン: 16.0.4266.1001
ホスト実行可能ファイル: EXCEL.EXE


ModuleTests.bas

'@TestModule
Option Explicit
Option Private Module

Private Assert As Rubberduck.PermissiveAssertClass

#Const USE_ASSERT_OBJECT = True

'@ModuleInitialize
Private Sub ModuleInitialize()
    Set Assert = New Rubberduck.PermissiveAssertClass
End Sub

'@ModuleCleanup
Private Sub ModuleCleanup()
    Set Assert = Nothing
    Debug.Print CStr(Timer()) & ": Assert = Nothing"
End Sub

'@TestMethod("Factory")
Private Sub ztcCreate_VerifiesDefaultManager()
    Dim dbm As Class2
    Set dbm = Class2.Create(ThisWorkbook.Path)
    #If USE_ASSERT_OBJECT Then
        Assert.IsNotNothing dbm
    #Else
        Assert.IsTrue Not dbm Is Nothing
    #End If
End Sub

Class1.cls

'@PredeclaredId
Option Explicit

Public Function Create(Optional ByVal DefaultPath As String = vbNullString) As Class1
    Dim Instance As Class1
    Set Instance = New Class1
    Set Create = Instance
End Function

Private Sub Class_Terminate()
    Debug.Print CStr(Timer()) & ": Class1 Class_Terminate"
End Sub

Class2.cls

'@PredeclaredId
Option Explicit

Private Type TClass2
    DllMan As Class1
End Type
Private this As TClass2

'@DefaultMember
Public Function Create(ByVal DllPath As String) As Class2
    Dim Instance As Class2
    Set Instance = New Class2
    Instance.Init DllPath
    Set Create = Instance
End Function

Friend Sub Init(ByVal DllPath As String)
    Dim FileNames As Variant
    Set this.DllMan = Class1.Create(DllPath)
End Sub

Private Sub Class_Terminate()
    Debug.Print CStr(Timer()) & ": Class2 Class_Terminate"
End Sub
4

2 に答える 2

1

元のコードを修正し、さらにいくつかの実験を実行して、以下に示すような奇妙な動作を明らかにしました。問題の性質はまだ不明であり、RDVBA に関連しているように見えますが (現在、RDVBA の問題を作成するのに十分な証拠があると思います)、問題を絞り込み、回避策を見つけました。

要するに、私はもともとこのテストAssert.IsNotNothing dbmを持っていて、インストルメント化されたコードを使用して、奇妙な終了タイミング/シーケンスを観察しました。修正されたコードには、説明のために条件付きコンパイル構造が含まれています。代わりにAssert.IsTrue Not dbm Is Nothingコンストラクトを選択すると、症状と問題の両方が解消されます。

于 2021-11-25T10:11:31.727 に答える