Сбой Firefox, создание экземпляра плагина NPAPI - PullRequest
0 голосов
/ 03 августа 2010

Раньше весь плагин работал как очень простая реализация со множеством глобальных и статических переменных, теперь я преобразовал его в объектно-ориентированный дизайн, чтобы я мог безопасно создавать экземпляры нескольких экземпляров и т. Д.

Однако, поскольку я это сделал, при создании экземпляра плагина он достигает метода 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 ().

Я определил свой собственный метод Allocate () для моего NPObject, и кажется, что 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 Ответ

2 голосов
/ 03 августа 2010

Проверьте ваш указатель npnfuncs в отладчике; Бьюсь об заклад, есть проблема с этим.

Запретите это, получите исходный код mozilla и создайте отладочную версию, чтобы вы могли пошагово просмотреть код и точно увидеть, где он падает. Это самый простой способ отследить проблемы с указателями, подобные описанным вами.

Серьезно, однако, я повторяю то, что сказал Георг (хотя я, по общему признанию, предвзят): посмотрите FireBreath, это избавит вас от многих проблем, а также упростит портирование на IE, если вы захотите.

...