Com VB6中的AddRef()
在visual basic 6中,是否可以从接口IUnknown调用方法AddRef,或者实现一些增加对象引用计数器的方法?我很确定VB6不支持直接访问IUnknown方法。但解决办法很简单。将此声明添加到模块:Com VB6中的AddRef(),com,vb6,reference,reference-counting,Com,Vb6,Reference,Reference Counting,在visual basic 6中,是否可以从接口IUnknown调用方法AddRef,或者实现一些增加对象引用计数器的方法?我很确定VB6不支持直接访问IUnknown方法。但解决办法很简单。将此声明添加到模块: Dim ReferenceHolder As Variant 然后让AddRef通过一个简单的赋值来调用 Set ReferenceHolder = someObject 相反,获得释放以获得调用 Set ReferenceHolder = Nothing 这是正常的
Dim ReferenceHolder As Variant
然后让AddRef通过一个简单的赋值来调用
Set ReferenceHolder = someObject
相反,获得释放以获得调用
Set ReferenceHolder = Nothing
这是正常的VB6内存管理工作。我相当肯定VB6不支持直接访问IUnknown方法。但解决办法很简单。将此声明添加到模块:
Dim ReferenceHolder As Variant
然后让AddRef通过一个简单的赋值来调用
Set ReferenceHolder = someObject
相反,获得释放以获得调用
Set ReferenceHolder = Nothing
这是正常的VB6内存管理工作。如果您试图在VB6完成的自动参考计数之外人为增加参考计数器,则可以执行以下操作:
Public Sub AddOneToRefCount(target As Object)
Dim tempObj As Object
Set tempObj = target 'VB6 calls AddRef for you here
Call CopyMemory(ByVal ObjPtr(tempObj), 0&, 4&) 'trick VB into not calling Release
End Sub
您可能还需要实现与此相反的方法来释放内存,否则会出现类似的内存泄漏 如果您试图在VB6完成的自动参考计数之外人为增加参考计数器,则可以执行以下操作:
Public Sub AddOneToRefCount(target As Object)
Dim tempObj As Object
Set tempObj = target 'VB6 calls AddRef for you here
Call CopyMemory(ByVal ObjPtr(tempObj), 0&, 4&) 'trick VB into not calling Release
End Sub
您可能还需要实现与此相反的方法来释放内存,否则会出现类似的内存泄漏 但是VB会在子系统退出时调用Release。最终的效果是调用AddRef一次,然后释放once@MarkJ-不会,因为CopyMemory会将封面下的引用归零。在CopyMemory之后,该引用为Nothing null。我使用这种技术在复杂的父子对象图中打断循环引用。您也可以反向创建SubtractOneFromRefCount例程。但是VB会在子对象退出时调用Release。最终的效果是调用AddRef一次,然后释放once@MarkJ-不会,因为CopyMemory会将封面下的引用归零。在CopyMemory之后,该引用为Nothing null。我使用这种技术在复杂的父子对象图中打断循环引用。您也可以反向创建SubtractOneFromRefCount例程。