Firefox崩溃实例化NPAPI插件

时间:2010-08-03 13:34:50

标签: firefox npapi browser-plugin

我之前使用整个插件作为一个非常简单的实现,包含许多全局变量和静态变量,我现在已将其转换为基于对象的设计,因此我可以安全地实例化多个实例等。

但是,由于我已经这样做了,在创建插件实例时,它会获得MyScriptableNPObject :: NewObject()方法,它会尝试调用createobject(),但永远不会返回并且浏览器崩溃。

ScriptableNPObject* ScriptableNPObject::NewObject(NPP npp) 
{
 _DebugLog("ScriptableNPObject::NewObject");

 ScriptableNPObject* newObj =  (MyScriptableNPObject*)npnfuncs->createobject(npp, &_npclass);

 _DebugLog("ScriptableNPObject::NewObject - end");

    return newObj;
}

我有一些基本的日志记录作为一种快速的调试方式,我可以看到这个方法是从getValue()按预期调用的,但是结束日志永远不会出来,所以显然出现了问题在createobject()中。

我已经为我的NPObject定义了我自己的Allocate()方法,据我所知,NPClass似乎是正确定义的,具体如下 -

NPObject* ScriptableNPObject::_Allocate(NPP npp, NPClass *aClass) 
{     
    return (NPObject *)new ScriptableNPObject(npp);
}


NPClass ScriptableNPObject::_npclass = {
    NP_CLASS_STRUCT_VERSION,
    ScriptableNPObject::_Allocate,
    ScriptableNPObject::_Deallocate,
 NULL,
    ScriptableNPObject::_HasMethod,
    ScriptableNPObject::_Invoke,
    ScriptableNPObject::_InvokeDefault,
    ScriptableNPObject::_HasProperty,
    ScriptableNPObject::_GetProperty,
    NULL,
    NULL,
    NULL,
 ScriptableNPObject::_Construct,
};

根据我的看法,npnfuncs结构也是有效的。所以我有点难过,哪些是错的!

非常感谢任何帮助,

感谢。

1 个答案:

答案 0 :(得分:2)

检查调试器中的npnfuncs指针;我打赌它有问题。

除此之外,获取mozilla源代码并构建调试版本,以便您可以单步执行代码并查看崩溃的确切位置。这是跟踪指针问题的最简单方法,如您所描述的那样。

但是,严重的是,我说的是格奥尔格所说的(虽然我确实有偏见):查看FireBreath,它可以为您节省大量的故障排除,并且如果您愿意,还可以更轻松地移植到IE。