Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Com VB6中的AddRef()_Com_Vb6_Reference_Reference Counting - Fatal编程技术网

Com VB6中的AddRef()

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 这是正常的

在visual basic 6中,是否可以从接口IUnknown调用方法AddRef,或者实现一些增加对象引用计数器的方法?

我很确定VB6不支持直接访问IUnknown方法。但解决办法很简单。将此声明添加到模块:

  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例程。