我正在尝试获取方法的地址(该方法称为EndScene),它是D3D9对象的函数,并将其分配给我的函数指针。
但是当我有地址时我将其分配给我的函数指针时遇到了麻烦,这就是我正在使用的代码:
typedef HRESULT (IDirect3DDevice9::* EndSceneFunc)( void );
IDirect3DDevice9* pTempDev = ...;
// get the address of the virtual table
BYTE* pVtable = reinterpret_cast<BYTE*>( pTempDev );
// assign the address of the EndScene function to the function pointer (error)
EndSceneFunc endsceneFunc = pVtable + ( sizeof(void*) * EndSceneIndex);
我得到的错误是:BYTE *类型的值不能用于初始化EndSceneFunc类型的实体。
有谁知道如何解决这个问题?
编辑:我必须通过走vtable
来做到这一点答案 0 :(得分:1)
你想要一个指向成员的函数,而不是函数的地址(假设这是存储在vtable中的内容,并假设你的恶作剧实际上给你vtable条目)。该语言提供了一种直接的方法:
EndSceneFunc endsceneFunc = &IDirect3DDevice9::EndScene;
编辑:我必须通过走vtable
来做到这一点
你不能,抱歉。为什么你认为你需要这样做?
我想修补它并用我自己的功能替换它
在这种情况下,您根本不需要指向成员的函数,并且您远远超出了已定义行为的范围。您可以尝试这样的事情:
// Reinterpret the pointer to the device as a pointer to a pointer
// to a table of pointers, hoping that its first member is a pointer
// to the vtable (which hopefully contains pointers to functions).
void *** ppVtable = reinterpret_cast<void***>( pTempDev );
// Indirect through that to get (hopefully) the pointer to the vtable
void ** pVtable = *ppVtable;
// Hopefully overwrite an element with a pointer to your function
pVtable[EndSceneIndex] = reinterpret_cast<void*>(myFunction);
答案 1 :(得分:-1)
EndSceneFunc endsceneFunc = pVtable + ( sizeof(void*) * EndSceneIndex);
此行是您的问题,因为pVtable的类型为BYTE *
。尝试将其强制转换为EndSceneFunc
。
EndSceneFunc endsceneFunc = reinterpret_cast<EndSceneFunc>(pVtable + ( sizeof(void*) * EndSceneIndex));
答案 2 :(得分:-1)
这可能是成员函数初始化的通用指针(来自语法),在这种情况下,Mike Seymour的答案通常是如何进行的。如果你想要一个指向静态成员函数的指针,那么它就是普通的函数指针类型。