我想獲取一個方法的地址(該方法稱爲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類型的實體。
有誰知道如何解決這個問題?
編輯:我必須步行V表
這實際上工作,謝謝,但我現在意識到即使犯了一個錯誤,我創建的pTempDev實際上應該分配給另一個進程已經創建的設備。這就是爲什麼我需要走虛擬表。你不能想到另一種解決方案嗎? – Jona 2013-05-10 18:21:38
@JonathanD:我不知道你的意思,你根本不需要'pTempDev'來獲取指針,一旦你有了它,你就可以在任何'IDirect3DDevice9'上使用它。如果你的意思是你需要使用這個指針調用某個設備上的函數,那麼將它作爲'(device。* endsceneFunc)()'或一個指針('device-> endsceneFunc)()'在一個對象上調用。 – 2013-05-10 18:24:03
我不想只是調用函數,我想修補它並用我自己的函數替換它。這就是爲什麼我認爲我需要走vtable,對吧? – Jona 2013-05-10 18:27:54