这个是我查到的代码,也是论坛里一位大神写的typedef 
HRESULT (STDMETHODCALLTYPE * LPFN_HOOKPROC)(IDirect3DDevice *pThis);LPFN_HOOKPROC Proc;HRESULT STDMETHODCALLTYPE HookEndScene(IDirect3DDevice *pThis)
{
    return Proc(pThis);
}void Hook(IDirect3DDevice *lpDev)
{
    PVOID pVmt = *((PVOID*)lpDev);//从接口指针找VMT指针
    DWORD dwProtect;
    VirtualProtect(&((PVOID*)pVmt)[20], sizeof(PVOID), PAGE_READWRITE, &dwProtect);
    Proc = ((LPFN_HOOKPROC*)pVmt)[20];//把VMT中第20个方法地址保存到Proc中
    ((LPFN_HOOKPROC*)pVmt)[20] = &HookEndScene;//把HookEndScene方法地址写到VMT中
    VirtualProtect(&((PVOID*)pVmt)[20], sizeof(PVOID), dwProtect, &dwProtect);
}然后放到vs2010中,就会报错
VirtualProtect(&(PVOID*)pvmt[17],sizeof(PVOID),PAGE_READWRITE,&dwProtect);
VirtualProtect(&(PVOID*)pvmt[17],sizeof(PVOID),dwProtect,&dwProtect);
这两句的错误是一样的,都是
error C2036: “PVOID”: 未知的大小
error C2440: “类型转换”: 无法从“void”转换为“PVOID *”
1>          void 类型的表达式不能转换为其他类型
是因为vs2010对这方面有新的要求了吗?  还是本来就是错的?
求各位大神指点一下

解决方案 »

  1.   

    不太清楚,我记得只规定了 void 是不能使用 sizeof 啊,不知道 void* 不能。
    你直接用 int* 什么的不就OK
    int WINAPI HookVtbl(void* pObject, unsigned int classIdx, unsigned int methodIdx, int newMethod)
    {
        int** vtbl = (int**)pObject;
        DWORD oldProtect = 0;
        int oldMethod = vtbl[classIdx][methodIdx];
        VirtualProtect(vtbl[classIdx] + sizeof(int*) * methodIdx, sizeof(int*), PAGE_READWRITE, &oldProtect);
        vtbl[classIdx][methodIdx] = newMethod;
        VirtualProtect(vtbl[classIdx] + sizeof(int*) * methodIdx, sizeof(int*), oldProtect, &oldProtect);
        return oldMethod;
    }