代码之家  ›  专栏  ›  技术社区  ›  Amir

将非静态方法注册为回调函数是否合乎逻辑?

  •  -1
  • Amir  · 技术社区  · 7 年前

    KeyLogger 和阶级 cHookProc

    首先我创造 在里面 键盘记录器

    然后我得到了他的地址 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 回复  |  直到 7 年前
        1
  •  1
  •   Matthieu Brucher    7 年前

    如果您的函数不使用类中的任何方法,那么它可能会工作,但这只是随机的机会,如果您更改函数并向对象添加引用,它将中断。在这种情况下,将其设置为静态方法。

    方法的回调应该用对调用该方法的对象的引用来包装。

    也可以使用唯一的指针 cHkProc