如何将可编写脚本的Mozilla插件实例与其NObject相关联?

时间:2020-03-06 14:38:28  来源:igfitidea点击:

我在将要编写的插件中的调用方法与适当的插件实例相关联时遇到问题。 http://developer.mozilla.org/zh-CN/Gecko_Plugin_API_Reference/Scripting_plugins上的文档没有提供足够的信息来真正有用。

简而言之,我试图了解插件预期将返回哪个脚本对象,以响应变量参数等于NPPpluginScriptableNPObject的NPP_GetValue调用。我猜对于插件的每个实例都应该有一个NPObject实例,但是NPClass中的invoke()方法应该如何从作为参数给出的可编写脚本的NPObject中找到插件实例(NPP)?我想我可以实现一个查找表来做到这一点,但是我感觉到我显然缺少了一些东西。

我在NPP_New()中的NPP的pdata成员中存储了一个指向C ++类实例(该实例实现插件的功能)的指针。

解决方案

我想我正在回答自己的问题...

我找到的解决方案(并且我仍然会赞赏其有效性,特别是如果我们认为有更好的方法的话)是分配一个NPObject派生结构,该结构在我公开的allocate()函数中具有指向我的实现类的指针从我的插件转到Firefox。然后,我将指向该NPObject的指针存储在NPP的pdata成员的NPP_New()中。

在invoke()中,我将NPObject指针强制转换为派生结构的其他成员,以便可以获取指向实现类实例的指针。

据我所知,设计的目的是NPObject对象是它们指向的NPClass的实例,它们通过处理这些实体的NPClass函数指针实现方法和属性,并且任何私有数据都应该是由实现分配和释放,并且其格式未指定。

它看起来像这样:

static NPClass refObject = {
    NP_CLASS_STRUCT_VERSION,
    My_Allocate,
    My_Deallocate,
    NULL,
    My_HasMethod,
    My_Invoke,
    My_InvokeDefault,
    My_HasProperty,
    My_GetProperty,
    NULL,
    NULL,
};

class MyImplClass {
    // Implementation goes here
};

struct MyNPObject : public NPObject {
    MyImplClass *my_impl_instance;
};

// This is just a bit of memory management - Mozilla wants us to allocate our own memory:
NPObject *My_Allocate(NPP inst, NPClass *)
{
    // We initialize the structure in NPP_New() below
    return (NPObject *)malloc(sizeof(MyNPObject));
}

NPError NPP_New( NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
             char* argn[], char* argv[], NPSavedData* saved )
{
    NPObject *scriptable_object = npnfuncs->createobject(instance, &refObject);
    npnfuncs->retainobject(scriptable_object);
    MyImplClass *new_player = new MyImplClass(); 

    instance->pdata = scriptable_object;
    ((MyNPObject*)instance->pdata)->my_impl_instance = new_player;
    return NPERR_NO_ERROR;

}