2012-05-04 1 views
0

Мой код плагина сбой, когда я вызываю NPN_GetValue. В основном я создал сценарируемый объект, который имеет метод getDevice, который может вернуть массив устройств в JavaScript. Ниже приведен фрагмент кода.Аварийный сбой Safari на NPN_GetValue

static bool mainNPObjectInvoke(NPObject *obj, NPIdentifier identifier, const NPVariant *args, uint32_t argCount, NPVariant *result) 
{ 
    printf("create main object"); 
    MainNPObject *mainObject = (MainNPObject *)obj; 

    if (identifier == methodIdentifiers[METHOD_ID_GET_DEVICES]) 
    { 
     NPObject *windowObj = NULL; 
     browser->getvalue(mainObject->npp, NPNVWindowNPObject, &windowObj); 
     // it crashed here 
    .... 
    } 
} 

Я создал экземпляр MainNPObject с использованием метода ниже.

NPObject *createMainNPObject(NPP npp) 
{ 
    MainNPObject *object = (MainNPObject *)browser->createobject(npp, &mainNPClass); 
    object->npp = npp; 

    theMainObject = object; 

    return (NPObject *)object; 
} 

Созданный объект CreateMainNPObject вызывается в функции плагина, которую я предоставлял браузеру.

NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) 
{ 
    PluginObject *obj = instance->pdata; 

    switch (variable) { 
     case NPPVpluginCoreAnimationLayer: 
      if (!obj->rootLayer) 
       setupLayerHierarchy(obj); 

      *(CALayer **)value = obj->rootLayer; 

      return NPERR_NO_ERROR; 

     case NPPVpluginScriptableNPObject: 

      if (!obj->mainObject) 
      { 
       obj->mainObject = createMainNPObject(instance); 
      } 
.... 
} 

И функция распределения как ниже.

static NPObject *mainNPObjectAllocate(NPP npp, NPClass *class) 
{ 
    initializeIdentifiers(); 

    MainNPObject *mainObject = malloc(sizeof(MainNPObject)); 
    mainObject->deviceManager = [[DeviceManager alloc] init]; 

    return (NPObject *)mainObject; 
} 

Определение MainNPObject:

typedef struct 
{ 
    NPObject *npobject; 
    NPP npp; 
    DeviceManager *deviceManager; 
} MainNPObject; 

При отладке кода, я обнаружил, что система подняла EXC_BAD_ACCESS при вызове browser-> ПолучитьЗначение и это выглядит как аэс указатель является недействительным.

0x00007fff83f82dab <+0019> je  0x7fff83f82db9 <_ZN6WebKit14NetscapePlugin7fromNPPEP4_NPP+33> 
0x00007fff83f82dad <+0021> incl 0x8(%rax) 

Может кто-нибудь помочь мне?

Спасибо!

+0

Как выглядит ваша функция выделения? – taxilian

+0

Я добавил функцию выделения в исходное сообщение. Большое спасибо! – cs2k

ответ

0

Хм; не видя ничего очевидного. Попробуйте добавить в свою структуру еще один параметр (int?) И установить его во время выделения или сразу послесловия, а затем проверить, все ли это значение, которое вы задали до вызова getvalue. Посмотрите, как ваша структура каким-то образом становится коррумпированной. Это случилось со мной однажды, когда я выбрал NPObject смешным в неочевидном виде.

+0

Я добавил член int в объект MainNPObject и установил значение 25 в allocate. Значение корректно передается, когда я проверил метод invoke. Также я создаю статический объект MainNPObject для записи объекта. Сравнивая его с тем, который прошел в браузере, они одинаковы. Плагин всегда сбой в точке WebKit :: NetscapePlugin :: fromNPP. Теперь я полностью потерян. Я загрузил проект в Dropbox, могу я попросить вас посмотреть дальше? https://www.dropbox.com/s/fvv74iu98a2c16f/NPAPI_Core_Animation_Movie_Plugin.zip – cs2k

+0

Наконец-то я нашел основную причину. Я ошибочно объявляю член NPObject в структуре MainNPObject как указатель! Когда браузер вызывает метод invoke, член npp указывает на другое место по этой причине. taxilian, я отметил ваш комментарий как ответ, так как он дает мне правильное направление для расследования. Благодарю. – cs2k