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)
誰かが私を助けてくれますか?
ありがとうございます!
割り当て関数はどのように見えますか? – taxilian
私はオリジナルの投稿に私のallocate関数を追加しました。どうもありがとう! – cs2k