VB6 局部变量中含有Object类型时,VB6的默认收尾工作
vb吧
全部回复
仅看楼主
level 11
余思培 楼主
当我们在使用Object类型时,经常使用Set objName = Nothing 来使其释放内存。
最近,我在编写一个组合类模块(一个类模块的代码使用了其他类的实例)时,遇到了一点点问题(从22点Debug到04点),在解决问题的过程中,我发现了:
VB6中,如果函数内部声明的Object类型局部变量,那么在函数结束前,会调用一个内部函数用以释放该变量——vbaFreeObj函数,下面我们来看一下这一函数的特点及其可能的运用。
2021年09月04日 11点09分 1
level 11
余思培 楼主
我先来贴出vbaFreeObj的汇编代码及我个人所作的一些注释
MSVBVM60!_vbaFreeObj:
push esi
mov esi, ec
mov eax, dword ptr [esi]
test eax, eax
je MSVBVM60!_vbaFreeObj+0x12
mov ecx, dword ptr [eax]
push eax
call dword ptr [ecx+8]
and dword ptr [esi], 0
pop esi
ret
2021年09月04日 11点09分 2
汇编语言,我只看过8086的汇编,后来16为的汇编我就……
2021年09月06日 00点09分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 我也没怎么学,也就了解了下原理,然后知道大致关键词,很多时候我都要边查边读代码
2021年09月06日 04点09分
level 11
余思培 楼主
本楼,我贴出大致的VB6版的翻译
'假设已知lpVar为Object变量的指针
'假设已知一个函数可以根据指针调用函数,原型为:FuncCall(Byval lpFunc As Long,ByVal dwParam As Long)
Dim lpThis&
Dim lpVtbl&
lpThis = VarPtr(lpThis)
If lpThis = 0 Then Exit Sub
lpVtbl = VarPtr(lpThis)
Call FuncCall(lpVtbl+8,lpThis)
Call MemCopy(lpVar,VarPrt(0),4)
2021年09月04日 11点09分 3
level 11
余思培 楼主
根据这一特点,我们可以
1.使用有实例的Object变量在VB6自动处理前,将其this指针置为0,用以绕开销毁
2.在函数中有临时的无实例Object变量在VB6自动处理前,更换为一个有实例的this指针,用以销毁该实例
2021年09月04日 11点09分 4
这一条可以忽视掉,好像有点问题
2021年09月04日 12点09分
level 11
余思培 楼主
关于Object类型变量的this指针的应用:
存在一个公共Object类型变量A,存在n个私有的Object类型变量B(n-1),通过一定的调度函数/模块,在恰当的时候将A与B(0~n-1)绑定,使程序在特定条件下访问私有Object信息。
比如说:同一窗体下多个UI的间的切换方案;游戏设计中访问、操作角色等信息等等
更多的应用也可以被大家发掘出来
//当然,和往常一样,我分享的这个东西同样不存在太大的实用性,不过我以前分享的一些的东西,还是实用性更强一点。
//另外,如果有新手偶然刷到本贴子,我也分享一本书用以进阶学习:《数据结构(Visual Basic 版)》
2021年09月04日 12点09分 5
太高深了
2021年09月06日 00点09分
研究的很透彻。[呵呵]
2021年09月06日 01点09分
@璐村惂鐢ㄦ埛_0748V5Z馃惥 没有,稍微反汇编下就能发现的(甚至不用反汇编)
2021年09月06日 04点09分
@波波波波波1987 不算多透彻,目前虽然借鸡生蛋(创建)和借刀杀人(销毁)都可以实现了,但如何在这种情况下调用确出现了难题
2021年09月06日 04点09分
level 14
送可丁可卯难见家
2023年08月04日 04点08分 6
1