与 PVOID 的参数类型不兼容

Incompatible with parameter type of PVOID

本文关键字:类型 不兼容 参数 PVOID      更新时间:2023-10-16

使用绕道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签名(也可以在这里找到):

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);
}

此函数签名为:

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 创建为静态函数,但它与全局函数没有太大区别。