Логично ли регистрировать нестатический метод как функцию обратного вызова? - PullRequest
0 голосов
/ 08 ноября 2018

Я создал 2 class.class KeyLogger и class cHookProc

сначала я создаю cHookProc в KeyLogger классе.

тогда я получаю адрес LRESULT CALLBACK cHookProc::HookProc по unsigned int cHookProc::getCallBackAddr()

это логично и всегда хорошо работает?

это KeyLogger.h

#pragma once
#include <time.h>
#include <windows.h>

class cHookProc{
public:
    LRESULT CALLBACK HookProc(int code, WPARAM wp, LPARAM lp);
    unsigned int getCallBackAddr();
private:
};

class KeyLogger{
public:
    KeyLogger();
    ~KeyLogger();
private:
    cHookProc *cHkProc;
};

а это KeyLogger.cpp

#include "KeyLogger.h"

KeyLogger::KeyLogger(){
    cHkProc = new cHookProc;
    int i = cHkProc->getCallBackAddr();
    HOOKPROC hprc = (HOOKPROC)i;
    HHOOK keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, hprc, NULL, NULL);
}
KeyLogger::~KeyLogger(){
    delete cHkProc;
}

LRESULT CALLBACK cHookProc::HookProc(int code, WPARAM wp, LPARAM lp){
    if (code == 0){
    .
    .
    .
    }
    return CallNextHookEx(NULL, code, wp, lp);
}
unsigned int cHookProc::getCallBackAddr(){
    LRESULT(__stdcall cHookProc::*ptrtofn)(int, WPARAM, LPARAM) = &cHookProc::HookProc;
    unsigned int *i;
    i = (unsigned int*)&ptrtofn;
    return *i;
}

1 Ответ

0 голосов
/ 08 ноября 2018

Если ваша функция не использует какой-либо метод из класса, тогда он может работать, но это просто случайный случай, и он сломается, если вы измените функцию и добавите ссылки на объект. Сделайте это статическим методом в этом случае.

Обратный вызов метода должен быть заключен в ссылку на объект, для которого вызывается метод.

Также используйте уникальный указатель для cHkProc.

...