如何调用方法作为回调?

问题描述 投票:0回答:1

我正在尝试将我的驱动程序重写为 OOP 架构,并且当我没有任何 std::XXXX 以及传递函数本身的参数时,我面临着调用回调等方法的问题通过模板。

所以我有以下课程:

class Log {
public:
    /*static*/ VOID LogNotifyUsermodeCallback(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2);

    NTSTATUS LogRegisterIrpBasedNotification(PDEVICE_OBJECT DeviceObject, PIRP Irp);
    NTSTATUS LogRegisterEventBasedNotification(PDEVICE_OBJECT DeviceObject, PIRP Irp);
};

我还有以下代码:

NTSTATUS Log::LogRegisterIrpBasedNotification(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
//Some line of code....
        KeInitializeDpc(&NotifyRecord->Dpc, // Dpc
            LogNotifyUsermodeCallback, // DeferredRoutine
            NotifyRecord // DeferredContext
        );
//Some line of code....
}

DeferredRoutine 具有以下调用参数的模式:

VOID Log::LogNotifyUsermodeCallback(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)

我不能将LogNotifyUsermodeCallback方法称为静态方法,因为参数是通过模板传递到那里的,并且该方法本身也调用了Log类的其他方法,我没有其他想法。所以,主要问题是:在所有这些条件下,我如何调用 LogNotifyUsermodeCallback 作为回调方法?

c++ driver wdm
1个回答
0
投票

C++ 注册函数的方式是

std::function
,而 C 处理注册的方式是函数指针 + userData 指针。

// From library
using callBackType = Ret (Arg1, Arg2, void* /* userData */);
void registerCallback(callBackType* f, void* userData);

// Your code
struct Obj
{
    static Ret MyStaticCallBack(Arg1 arg1, Arg2 arg2, void* userData) {
        Obj* self = reinterpret_cast<Obj*>(userData);

        return self->MyMethod(arg1, arg2);
    }
    Ret MyMethod(Arg1 arg1, Arg2 arg2);
};

然后您注册回调的代码将是:

Obj my_object;

registerCallback(&Obj::MyStaticCallBack, my_object);
© www.soinside.com 2019 - 2024. All rights reserved.