2012-05-04 59 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); 
      } 
.... 
} 

而分配功能如下所示。 MainNPObject的

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

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

    return (NPObject *)mainObject; 
} 

定義:

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

通過調試代碼,我發現系統調用瀏覽器的>的getValue和它看起來像NPP指針無效時提出了一個EXC_BAD_ACCESS。

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

有人可以幫我嗎?

謝謝!

+0

你的分配函數是什麼樣的? – taxilian

+0

我在原始文章中添加了我的分配函數。非常感謝! – cs2k

回答

0

嗯;沒有看到任何明顯的。嘗試將另一個參數(一個int?)添加到結構中,並在分配期間或後續字詞中設置它,然後再檢查它是否仍然是您在調用getvalue之前設置的值。看看你的結構是否以某種方式變得腐敗。當我以非明顯的方式投射NPObject時,發生過這種事。

+0

我在MainNPObject中添加了一個int成員,並在allocate中將該值設置爲25。當我檢入invoke方法時,該值正確傳入。另外我創建一個靜態MainNPObject來記錄對象。與瀏覽器傳入的內容相比,它們是相同的。該插件始終在WebKit :: NetscapePlugin :: fromNPP處崩潰。現在我完全迷失了。我已經將該項目上傳到Dropbox,請問您有進一步的看法嗎? https://www.dropbox.com/s/fvv74iu98a2c16f/NPAPI_Core_Animation_Movie_Plugin.zip – cs2k

+0

最後我找到了根本原因。我錯誤地將MainNPObject結構中的NPObject成員聲明爲一個指針!當瀏覽器調用invoke方法時,由於這個原因,npp成員指向其他地方。我把你的評論標記爲答案,因爲它給了我正確的調查方向。謝謝。 – cs2k