初始化函数指针

时间:2013-05-10 18:11:07

标签: c++ function-pointers

我正在尝试获取方法的地址(该方法称为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

来做到这一点

3 个答案:

答案 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的答案通常是如何进行的。如果你想要一个指向静态成员函数的指针,那么它就是普通的函数指针类型。