昨天,我在一篇文章中简单地介绍了COM组件对象的内存布局,我透露会在后面的文章中讲讲神秘的”Adjustor thunks”。那今天就来说道说道这玩意。
如果你有调试过反汇编代码,则你应该经常看到一些看起来比较奇怪的小型函数,这些函数就叫做”Adjustor thunks”。
下面我们来看看上次文章中我们提到的对象。
在上图中,当我们需要IPersist接口时,p会被返回。q是一个指向IQueryService接口的指针。
现在,只有一个QueryInterface方法,但是在虚函数表中却有两个条目。另外,请记得:在虚函数表中的每个函数将会从它的”this”指针接收到其对应的接口指针。对于第一个QueryInterface来说,这没有什么问题,因为对象的接口指针也指向了这个函数。
但是对于第二个QueryInterface来说,就不太妙了,因为它的接口指针是q,而不是p。
这个时候,”Adjustor thunks”就开始起作用了,如下图所示:
这个adjustor thunk将会获取”this”指针,然后对地址值减去4,这样就将q转换成了p,然后直接跳转到第一个QueryInterface方法来执行。
任何时候,当你处理多重继承,并且一个虚函数在多个基类中都被实现了的时候,你总是会得到adjustor thunk来处理第二个或者后面的基类中的方法,来将”this”指针转换为一个适当的,统一的格式。
所以,此次的Thunk小技巧大家Get到了吧?
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Adjustor thunks》