Vb6 如何获取ADODB记录集对象的引用计数?

Vb6 如何获取ADODB记录集对象的引用计数?,vb6,adodb,reference-counting,Vb6,Adodb,Reference Counting,我正在调查一些旧VB6代码中的内存泄漏,这些代码似乎与记录集对象有关,因此我试图获取对象上的引用计数。我在网上找到了一些代码,这些代码将提供对对象的引用计数,并且它适用于一个自行开发的类。但当我尝试将其应用于ADODB记录集对象时,计数总是1492925242。我在现有应用程序中尝试过这个,然后在一个虚拟应用程序中尝试过——总是返回相同的数字(除非没有引用,否则它是0) 下面是获取引用计数的代码: Private声明子rtlmovemory Lib“kernel32”(dest为Any,src为

我正在调查一些旧VB6代码中的内存泄漏,这些代码似乎与记录集对象有关,因此我试图获取对象上的引用计数。我在网上找到了一些代码,这些代码将提供对对象的引用计数,并且它适用于一个自行开发的类。但当我尝试将其应用于ADODB记录集对象时,计数总是1492925242。我在现有应用程序中尝试过这个,然后在一个虚拟应用程序中尝试过——总是返回相同的数字(除非没有引用,否则它是0)

下面是获取引用计数的代码:

Private声明子rtlmovemory Lib“kernel32”(dest为Any,src为Any,ByVal n字节为Long)
函数objRefCnt(obj作为IUnknown)的长度
如果不是,那么obj什么都不是
rtlmovemory objRefCnt,ByVal ObjPtr(obj)+4,4
objRefCnt=objRefCnt-2
其他的
objRefCnt=0
如果结束
端函数
下面是在ADODB记录集上调用它的代码:

Sub-main()
作为ADODB.记录集的Dim obj_1
作为ADODB.记录集的Dim obj_2
调试。打印objRefCnt(obj_1)'0
Set obj_1=新的ADODB.Recordset
调试。打印objRefCnt(obj_1)'1
设置obj_2=obj_1
调试。打印objRefCnt(obj_1)'2
调试。打印objRefCnt(obj_2)'2
Set obj_2=新的ADODB.Recordset
调试。打印objRefCnt(obj_1)'1
调试。打印objRefCnt(obj_2)'1
端接头
这将返回以下内容:

0
1492925242
1492925242
1492925242
1492925242
1492925242
但是,当我添加一个名为
Class1
的伪类,该类具有单个属性(整数),并将
obj_1
obj_2
创建为
Class1
对象时,我得到了以下结果:

0
1.
2.
2.
1.
1.
关于如何获得ADODB记录集的引用计数,有什么想法吗?
提前感谢。

您找到的代码假定引用计数存储在对象内部偏移量4处。没有这样的要求。定义方法,而不是必须存储私有变量的位置(引用计数是对象的私有变量)

获取引用计数的方法(仅用于测试目的)是

为了从Internet上的VB6、
olelib.tlb
(Edanmo的OLE接口和函数)中执行此操作,请参考它,然后

公共函数GetRefCount(ByVal obj作为olelib.IUnknown)的长度
obj.AddRef
GetRefCount=obj.Release-2
端函数
Dim r1作为ADODB.Recordset
将r2设置为ADODB.Recordset
Set r1=新的ADODB.Recordset
设置r2=r1
MsgBox GetRefCount(r1)'2

出现
m_dwRefCount
ADODB的成员变量。记录集实例位于偏移量16处

尝试此
objRefCnt
替换:

Private Declare Sub RtlMoveMemory Lib "kernel32" (dest As Any, src As Any, ByVal nbytes As Long)

Function RecordsetRefCnt(rs As Recordset) As Long
    If Not rs Is Nothing Then
       RtlMoveMemory RecordsetRefCnt, ByVal ObjPtr(rs) + 16, 4
       RecordsetRefCnt = RecordsetRefCnt - 1
    Else
       RecordsetRefCnt = 0
    End If
End Function
JFYI,这里是一个基于
GetRefCount
impl的
AddRef
/
Release
版本,没有额外的typelib

Private Declare Function DispCallFunc Lib "oleaut32" (ByVal pvInstance As Long, ByVal oVft As Long, ByVal lCc As Long, ByVal vtReturn As VbVarType, ByVal cActuals As Long, prgVt As Any, prgpVarg As Any, pvargResult As Variant) As Long

Public Function GetRefCount(pUnk As IUnknown) As Long
    Const CC_STDCALL    As Long = 4
    Dim vResult         As Variant
    
    Call DispCallFunc(ObjPtr(pUnk), 1 * 4, CC_STDCALL, vbLong, 0, ByVal 0, ByVal 0, 0)
    Call DispCallFunc(ObjPtr(pUnk), 2 * 4, CC_STDCALL, vbLong, 0, ByVal 0, ByVal 0, vResult)
    GetRefCount = vResult - 2
End Function