2010-08-03 1 views
0

У меня был весь плагин, который работал ранее как очень простая реализация с большим количеством глобальных и статических переменных, теперь я преобразовал его в объектную конструкцию, чтобы я мог безопасно создавать несколько экземпляров и т. Д.Firefox crash экземпляр NPAPI-плагин

Однако, поскольку я сделал это, при создании экземпляра плагина он дошел до метода MyScriptableNPObject :: NewObject(), где он пытается вызвать createobject(), но никогда не возвращается и браузер выходит из строя.

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

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

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

    return newObj; 
} 

У меня есть некоторое базовое протоколирование там как быстрый способ отладки это, и я могу видеть, что этот метод вызывается из ПолучитьЗначения(), как и ожидался, но конец бревна никогда не выходит, так что-то очевидно, ошибочно работает в createobject().

я определил свой метод мой Выделяют() для моей 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

Я сейчас в запуске, но если вы еще не посмотрели [этот учебник] (http://colonelpanic.net/2009/03/building-a-firefox-plugin-part-one/) или [FireBreath] (http://code.google.com/p/firebreath/) - [реализация NPAPI здесь] (http://code.google.com/p/firebreath/source/browse/#hg/src/ NpapiPlugin) - пожалуйста, сделайте это. –

ответ

2

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

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

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

+0

Еще раз спасибо, да, вы были правы в указателе npnfuncs, я думаю, что исправил его, изменив способ копирования и хранения структуры, хотя я в тупике, почему он не работает для начала! Что касается Firebreath, я бы предпочел использовать это и попытался в первую очередь, но имел проблемы с его интеграцией в нашу структуру сборки, поэтому, к сожалению, пришлось отказаться от этого. –

+0

жаль слышать это; иногда требуется немного времени для переключения существующей структуры сборки на использование cmake, но без cmake было бы почти невозможно достичь уровня простоты, который имеет FireBreath. Есть несколько разных вещей, которые вы можете сделать, чтобы упростить это иногда, но, конечно, сложность вашего проекта будет весить там. – taxilian

+0

Дорогой Адам Кобб, не могли бы вы рассказать нам, как вы исправили свою проблему? – Orca