0

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

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;

コードをデバッグすると、システムが browser->getValue を呼び出したときに EXC_BAD_ACCESS が発生し、npp ポインターが無効であることがわかりました。

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

誰かが私を助けることができますか?

ありがとう!

4

1 に答える 1

0

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

于 2012-05-05T05:25:42.380 に答える