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