通常回调函数应该有一个" 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
)。一切都很糟糕。有没有更清洁的方法来实现这一目标?