0

デバッグ上の理由から、参照として残っているクラスインスタンスを破棄したいと思います。それは可能ですか?これが本番コードになることは決してないので、エレガントで安定している必要はありません。

明確にするために:

Public Sub Main
    Dim o as MyClass
    Set o = New MyClass //o is created, one reference
    DestroyObject o     //Class_Terminate is called and the object destroyed
    //Further code, not using o
End Sub                 //Possible runtime error here (don't care)

それは可能ですか?1つの方法はIUnknown::Release、手動で参照数を減らすために呼び出すことですが、どのくらいの頻度で呼び出す必要がありますか?

4

2 に答える 2

3

これは非常に悪い考えです

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private m_oRef As Class1

Private Sub Command1_Click()
    Dim o As Class1

    Set o = New Class1
    Set m_oRef = o
    DestroyObject o
    ' releasing m_oRef after this point will bring down the IDE '
End Sub

Private Sub DestroyObject(pArg As Object)
    Dim lRefCount       As Long
    Dim lIdx            As Long
    Dim pUnk            As IUnknown

    lIdx = ObjPtr(pArg) + &H20
    Call CopyMemory(lRefCount, ByVal lIdx, 4)
    For lIdx = 1 To lRefCount - 2
        Call CopyMemory(pUnk, pArg, 4)
        Set pUnk = Nothing
    Next
    Set pArg = Nothing
End Sub
于 2010-06-01T08:07:24.197 に答える
1

ご存知のように、オブジェクト自体はClass_Terminate、参照カウントがゼロになったと判断したときに呼び出すので、呼び出すことを提案することでReleaseうまくいくはずです。オブジェクト自体がエラーをスローするReleaseまで呼び出しを続けてください。Release

BruceMcKinneyのHardcoreVisualBasicのこのページは、参照カウントを取得できる可能性のある1つの方法を提案していますが、このスキーム(これ以上Releaseできなくなるまで)を行わない限り、その方法に入る必要はないと思います。Release動作しません。

「これが本番コードになることは決してないだろう」-もちろん、あなたの仮定に注意してください...

于 2010-06-01T07:39:24.087 に答える