0

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

4

3 回答 3

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);
于 2013-05-10T18:13:28.237 回答
-1
EndSceneFunc endsceneFunc = pVtable + ( sizeof(void*) * EndSceneIndex);

这行是你的问题,因为 pVtable 是BYTE *. 尝试将其转换为EndSceneFunc.

EndSceneFunc endsceneFunc = reinterpret_cast<EndSceneFunc>(pVtable + ( sizeof(void*) * EndSceneIndex));
于 2013-05-10T18:13:25.283 回答
-1

这可能是指向成员函数初始化(来自语法)的通用指针,在这种情况下,Mike Seymour 的答案通常是您将如何去做。如果您想要一个指向静态成员函数的指针,那么它具有普通的函数指针类型,这是不同的。

于 2013-05-10T18:27:51.547 回答