2016-03-15 110 views
1

使用彎路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

回答

2

此功能的簽名是:

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