如果回调函数没有这样的参数,那么伪造回调上下文的好方法是什么?

时间:2016-07-11 16:04:49

标签: c++ callback

通常回调函数应该有一个" context"可以用于对象指针的参数,但是对于那些没有这种参数的遗留代码来说,伪造它的好方法是什么?

我经常需要编写调用库并接收来自它的回调调用的代码,但是回调必须实际在我的对象的上下文中运行。

我通常使用静态函数作为回调来伪造它,而回调又包含一个静态变量,我将其设置为对象指针,然后在其上调用成员函数。这是我对微软FMIFS库的回调:

// Return TRUE for Continue, FALSE for Cancel
/* static */ BOOLEAN CALLBACK CFmifsCallbackHelper::FmifsCallback
(
    zFmifsCallbackCommand Command, 
    DWORD                 Modifier, 
    PVOID                 Argument
)
{
    static CFmifsCallbackHelper* helper = NULL;

    if (Command == zFmifsCallbackCommandInvalid)
    {
        helper = reinterpret_cast<CFmifsCallbackHelper*>(Argument);
        return TRUE;
    }
    else if (helper)
    {
        BOOLEAN retValue = helper->Callback(Command, Modifier, Argument);
        return retValue;
    }
    return TRUE;
}

因此静态回调函数需要使用&#34; misused&#34;在它实际用作回调之前的参数,它仅在参数至少是指针大小时才有效,并且不能对不同的上下文进行并发调用。此外,我需要绝对确保库永远不会使用我用来设置上下文(Command)的zFmifsCallbackCommandInvalid值(helper)。一切都很糟糕。有没有更清洁的方法来实现这一目标?

0 个答案:

没有答案