我正在阅读某人的(公共)源代码,我遇到过这一行并且不知道它的作用。我已经尝试过它了,但它总是让我感到困惑,尽管我尝试了。
uintptr_t* pInterfaceVTable = (uintptr_t*)*(uintptr_t*)pd3dDevice;
pd3dDevice
是LPDIRECT3DDEVICE9
,是IDirect3DDevice9*
。 IDirect3DDevice9
是一个继承IUnknown
的类,它们都实现了一堆虚函数。
有人可以更加世俗地请一行一行地帮助我解决这段代码的作用吗?
非常感谢你的时间!
答案 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 *