Несовместим с типом параметра PVOID.

Используя 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 подпись (также можно найти здесь):

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

person majidarif    schedule 15.03.2016    source источник
comment
Предоставьте дополнительную информацию, пожалуйста. Какая подпись у DetourAttach? Какой тип Std::m_Key? Что DetourAttach делает со своими параметрами и что вы хотите передать? минимально воспроизводимый пример был бы идеальным.   -  person Angew is no longer proud of SO    schedule 15.03.2016
comment
&(PVOID&) просто неправильно. Это будет означать, что вы передаете указатель на ссылку на указатель типа void   -  person Chris    schedule 15.03.2016


Ответы (1)


Эта сигнатура функции:

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

person marcinj    schedule 15.03.2016
comment
Это дает мне & illegal operation on bound member function expression и DetourAttach function does not take 1 args. - person majidarif; 15.03.2016
comment
m_Key - это функция? Похоже, это переменная. - person marcinj; 15.03.2016
comment
Хорошо, я полагаю, вам нужна глобальная функция или статическая, чтобы использовать DetourAttach. - person marcinj; 15.03.2016
comment
Ах да, это signed int __cdecl m_Key(int a1, int a2, int a3);. - person majidarif; 15.03.2016
comment
Так что, тогда я должен просто избавиться от классов? :D - person majidarif; 15.03.2016
comment
У вас может быть глобальная функция, которая будет вызывать ваш _std-›m_Key(...). Затем используйте эту глобальную функцию в качестве второго параметра DetourAttach. Но я не уверен, что это то, чего вы хотите. - person marcinj; 15.03.2016
comment
@majidarif: Чтобы использовать Detours, вам нужно четко понимать, как работает код. В частности, должны быть понятны такие вещи, как разница между объектом и классом. Когда вы передаете адрес функции-члена в Detours, класс является неявным в функции-члене, но объект — нет. Так что вы не можете сказать, что я хочу использовать классы; вы хотите использовать объект. Исключение: статическим методам не нужен объект, но они сработали бы. - person MSalters; 15.03.2016