与PVOID的参数类型不兼容

时间:2016-03-15 09:30:05

标签: c++ visual-studio-2015 detours

使用绕道v3,我收到此错误:

argument of type "signed int (Std::*)(int a1, int a2, int a3)" is incompatible with parameter of type "PVOID"   Std.cpp 39  

当我尝试从我班上的一个函数中使用DetourAttach时。

Std* _std = new Std();

case DLL_PROCESS_ATTACH:
    DetourAttach(&(PVOID&)_std->m_pKey, &Std::m_Key);

// or if I do this
DetourAttach(&(PVOID&)_std->m_pKey, _std->m_Key);
// the error becomes Std::m_Key non-stardard syntax; use & to create a pointer to member

我知道我可以不使用课程这样做,但我希望这样做。有什么建议吗?

更新

DetourAttach签名(也可以找到here):

LONG WINAPI DetourAttach(PVOID *ppPointer,
                         PVOID pDetour)

至于Std::m_Key

int Std::m_Key(int a1, int a2, int a3)
{
    return m_pKey(a1, a2, a3);
}

1 个答案:

答案 0 :(得分:2)

此功能签名是:

LONG DetourAttach(
    PVOID * ppPointer,
    PVOID pDetour
    );

第一个参数是指向函数detoured的指针。第二个是你自己的函数,将被调用。由于只能提供单个指针,因此无法在类实例上调用方法。要调用类实例方法,您需要一个指向类对象的指针和一个指向方法的指针。

所以你需要一个免费的功能(非会员)才能让它发挥作用。

[编辑]

你的自由函数可以调用std类实例方法:

Std* _std = new Std();
int m_Global_Key(int a1, int a2, int a3)
{
    return _std->m_Key(a1, a2, a3);
}

或者你可以制作一个静态函数Std :: m_Key,但它与全局函数的区别不大。