gpt4 book ai didi

c++ - NPAPI:需要 RetainObject() 两次处理程序,否则 SIGBUS

转载 作者:行者123 更新时间:2023-11-30 04:25:57 24 4
gpt4 key购买 nike

在我的 NPAPI 插件中,一些对象有一个可读可写的“onEvent”属性,它会在某些事件发生时被调用。

我的 Javascript 代码将如下所示:

myObject.onEvent = function( event ) {
console.log("Event: " + event );
}

// if I put this next line, the next call to the 'onEvent' handler will SIGBUS
// when there's no RetainObject() in the getter.
console.log("Event handler : " + myObject.onEvent);

在插件的 C++ 端,我有这样的代码:

bool MyPluginObject::getOnEvent(NPIdentifier id, NPVariant *result)
{
if( _onEvent )
{
OBJECT_TO_NPVARIANT( _onEvent, *result);
NPN_RetainObject( _onEvent ); // needed ???? why??
}
else
VOID_TO_NPVARIANT(*result);

return true;
}

bool MyPluginObject::setOnEvent( NPIdentifier id, const NPVariant *value )
{
if ( value && NPVARIANT_IS_OBJECT( *value ) )
{
if( _onEvent != NULL )
{
// release any previous function retained
NPN_ReleaseObject( _onEvent );
}

_onEvent = NPVARIANT_TO_OBJECT( *value );
NPN_RetainObject( _onEvent ); // normal retain

return true;
}
return false;
}

void MyPluginObject::onEvent(void)
{
NPVariant event = [...];

if ( _onEvent!= NULL )
{
NPVariant retVal;
bool success = NPN_InvokeDefault( _Npp, _onEvent, &event, 1, &retVal );
if( success )
{
NPN_ReleaseVariantValue(&retVal);
}
}
}

奇怪的是,我已经为 SIGBUS 问题苦苦挣扎了一段时间,一旦我在 getter 中添加了 NPN_RetainObject(),正如您在上面看到的,一切都很好。

我在声明中没有发现Mozilla doc中需要它, 既不在塔西莲的真棒doc about NPAPI .

我不明白:当浏览器请求我保留的属性时,为什么我必须第二次保留它?

我是否应该在调用 InvokeDefault() 时保留该函数?但是,为什么?我已经说过我想保留它。

getProperty()InvokeDefault() 是否在不告诉我的情况下实际执行了 NPN_ReleaseObject()

最佳答案

您始终必须使用 NPAPI 保留对象输出参数,这并非特定于属性 getter 。

在您的特定情况下,该对象可能仍然存在,但在一般情况下则不然:
考虑将您不打算从插件中保持事件状态的对象返回给调用者。您必须将所有权转移给调用者,并且不能返回保留计数为 0 的对象。

关于c++ - NPAPI:需要 RetainObject() 两次处理程序,否则 SIGBUS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11824065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com