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

C++ 将非静态方法注册为回调函数是否合乎逻辑?,c++,callback,static,C++,Callback,Static,我创建了2个class.classKeyLogger和classcHookProc 首先,我在KeyLogger类中创建cHookProc 然后我通过unsigned int cHookProc::getCallBackAddr()获取LRESULT CALLBACK cHookProc::HookProc的地址 它是否合乎逻辑,并且总是运行良好 这是KeyLogger.h #pragma once #include <time.h> #include <windows.h&g

我创建了2个class.class
KeyLogger
和class
cHookProc

首先,我在
KeyLogger
类中创建
cHookProc

然后我通过
unsigned int cHookProc::getCallBackAddr()获取
LRESULT CALLBACK cHookProc::HookProc的地址

它是否合乎逻辑,并且总是运行良好

这是
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;
};

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

方法上的回调应该使用对调用该方法的对象的引用进行包装


还可以为
cHkProc

使用唯一指针,因为非静态成员函数需要调用一个对象,所以实际上您不能这样做。如果您没有,那么您可以制作一个静态成员函数包装器,如果该函数还可以访问该类的实例(对象)。将地址放入
int
是行不通的。非静态成员无法注册为回调,因为签名不匹配。@VTT在搜索了很多之后,我发现您的答案完全正确,我的代码不正确。谢谢。如果使用回调的代码可以访问该类的实例(或派生类的实例),那么将该类的成员函数注册为回调是有意义的。但只有当使用回调的代码将成员函数与类实例关联并正确调用它时,才是这样。这是一组非常狭窄的适用条件。大多数回调方案的目标是更通用(例如,比单个类或其派生类集在更多上下文中有用)。这难道不能保证我的代码安全吗?如果没有对方法调用回调,那么它就错了,完全错了。
#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;
}