2012-05-04 8 views
0

NPN_GetValueを呼び出すと、プラグインコードがクラッシュします。基本的に私はJavaScriptにデバイス配列を返すことができる 'getDevice'メソッドを持つスクリプト可能なオブジェクトを作成しました。以下はコードスニペットです。NPN_GetValueでSafariプラグインがクラッシュする

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); 
      } 
.... 
} 

allocate関数は以下のとおりです。 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を呼び出すときに、システムがEXC_BAD_ACCESSを上げ、NPPポインタが無効であるように見えることがわかりました。

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

誰かが私を助けてくれますか?

ありがとうございます!

+0

割り当て関数はどのように見えますか? – taxilian

+0

私はオリジナルの投稿に私のallocate関数を追加しました。どうもありがとう! – cs2k

答えて

0

Hmm;何も明らかではない。あなたの構造体に別のパラメータ(int?)を追加して、割り当て中または直後に設定し、後でgetvalueを呼び出す前に設定した値であるかどうかを確認してください。あなたの構造体が何らかの形で壊れているかどうかを確認してください。私がNPObjectを面白くない方法で面白いものにしていたとき、それは私に一度起こりました。

+0

MainNPObjectにintメンバーを追加し、allocateで値を25に設定しました。呼び出しメソッドをチェックインすると、値が正しく渡されます。また、オブジェクトを記録する静的なMainNPObjectを作成します。ブラウザから渡されたものと比較すると、同じです。プラグインはWebKit :: NetscapePlugin :: fromNPPの時点で常にクラッシュします。今私は完全に失われています。私はdropboxにプロジェクトをアップロードしましたが、私はあなたにさらに見てみることがありますか? https://www.dropbox.com/s/fvv74iu98a2c16f/NPAPI_Core_Animation_Movie_Plugin.zip – cs2k

+0

最後に根本原因を発見しました。私は間違ってMainNPObject構造体のNPObjectメンバをポインタとして宣言します!ブラウザがinvokeメソッドを呼び出すと、nppメンバはこの理由のために別の場所を指します。タクシニアン、私は調査の正しい方向性を与えるので、私は答えとしてあなたのコメントをマークしました。ありがとう。 – cs2k

関連する問題