我之前使用整个插件作为一个非常简单的实现,包含许多全局变量和静态变量,我现在已将其转换为基于对象的设计,因此我可以安全地实例化多个实例等。
但是,由于我已经这样做了,在创建插件实例时,它会获得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结构也是有效的。所以我有点难过,哪些是错的!
非常感谢任何帮助,
感谢。
答案 0 :(得分:2)
检查调试器中的npnfuncs指针;我打赌它有问题。
除此之外,获取mozilla源代码并构建调试版本,以便您可以单步执行代码并查看崩溃的确切位置。这是跟踪指针问题的最简单方法,如您所描述的那样。
但是,严重的是,我说的是格奥尔格所说的(虽然我确实有偏见):查看FireBreath,它可以为您节省大量的故障排除,并且如果您愿意,还可以更轻松地移植到IE。