C式铸造混乱

时间:2011-09-21 08:09:42

标签: c++ visual-c++ c++11

我正在阅读某人的(公共)源代码,我遇到过这一行并且不知道它的作用。我已经尝试过它了,但它总是让我感到困惑,尽管我尝试了。

uintptr_t* pInterfaceVTable = (uintptr_t*)*(uintptr_t*)pd3dDevice;

pd3dDeviceLPDIRECT3DDEVICE9,是IDirect3DDevice9*IDirect3DDevice9是一个继承IUnknown的类,它们都实现了一堆虚函数。

有人可以更加世俗地请一行一行地帮助我解决这段代码的作用吗?

非常感谢你的时间!

3 个答案:

答案 0 :(得分:3)

uintptr_t是一个可以存储指针的整数类型。

作者假设(知道?)IDirect3DDevice9中的第一个条目是一个指针,因此他将IDirect3DDevice9转换为(uintptr_t *)并取消引用它以访问该指针。然后他再次将uintptr_t转换为指针(指向uintptr_t)以将其分配给pInterfaceVTable。
正如评论和AndyT所提到的那样,使用的编译器存储了指向VTable的指针,但C ++无法保证这一点。

答案 1 :(得分:1)

似乎作者剖析了IDirect3DDevice9实例的虚拟表。我可以想象一个原因 - 代码注入或挂钩。可以将自定义代码插入到IDirect3DDevice9实现中以挂钩其方法调用,原因有多种,例如:将游戏录制为视频

答案 2 :(得分:0)

uintptr_t* pInterfaceVTable = (uintptr_t*)*(uintptr_t*)pd3dDevice;

看起来会对uintptr_t *进行强制转换,然后取消引用指针,然后将解除引用的结果转换为uintptr_t *