不兼容的参数类型PVOID

问题描述:

使用弯路V3的,我得到这个错误。不兼容的参数类型PVOID

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

请提供一些更多信息。 'DetourAttach'的签名是什么?什么是“Std :: m_Key”的类型? 'DetourAttach'对它的参数做了什么,你想传递什么?一个[mcve]将是理想的。 – Angew

+1

&(PVOID&)显然是错误的。这意味着你正在传递一个指针指向一个类型为void – Chris

此功能的签名是:

LONG DetourAttach(
    PVOID * ppPointer, 
    PVOID pDetour 
    ); 

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

所以你需要一个免费的功能(非会员)才能使它工作。

[编辑]

您的免费功能,可以打电话给你标准类的实例方法:

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

或者你可以做的std :: m_Key,静态的功能,但它不会从全球太大的差别功能。

+0

的指针。这样做会给我'对绑定成员函数表达式进行'非法操作',并且'DetourAttach函数不需要1个参数'。 – majidarif

+0

是m_Key的一个函数吗?它看起来好像是一个变量。 – marcinj

+0

好吧,我想你需要一个全局函数,或者静态的使用DetourAttach。 – marcinj