C++ 将非静态方法注册为回调函数是否合乎逻辑?
我创建了2个class.classC++ 将非静态方法注册为回调函数是否合乎逻辑?,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
KeyLogger
和classcHookProc
首先,我在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;
}