2016-03-15 2 views
1

Использование обходных путей v3, я получаю эту ошибку:несовместимым с типом параметра PVOID

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 

Я знаю, что могу сделать это без использования классов, но я хочу это сделать. Какие-либо предложения?


Update

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» с его параметрами и что вы хотите передать? A [mcve] был бы идеальным. – Angew

+1

& (PVOID &) просто неправильно. Это означало бы, что вы передаете указатель на ссылку на указатель типа void – Chris

ответ

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, статическую функцию, но она не будет сильно отличаться от глобальной функция.

+0

Выполнение этого дает мне «& незаконную операцию над выражением функции связанных членов», а функция «DetourAttach» не принимает 1 аргумент ». – majidarif

+0

является m_Key функцией? Похоже, что это переменная. – marcinj

+0

Хорошо, я полагаю, вам нужна глобальная функция, или статическая, чтобы использовать DetourAttach. – marcinj

Смежные вопросы