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

Firefox 如何将可编写脚本的Mozilla插件实例与其NObject关联?,firefox,plugins,npapi,Firefox,Plugins,Npapi,我在将我正在编写的插件中调用的方法与相应的插件实例相关联时遇到了一个问题。上的文档没有提供足够的信息,因此在这方面没有真正的用处 简言之,我试图理解插件在变量参数等于NPPpluginScriptableNPObject的情况下响应对NPP_GetValue的调用将返回哪个可编写脚本的对象。我猜插件的每个实例都应该有一个NPObject实例,但是NPClass中的invoke()方法如何从作为参数提供的可编写脚本的NPObject中找到插件实例(NPP)?我想我可以实现一个查找表来做到这一点,但

我在将我正在编写的插件中调用的方法与相应的插件实例相关联时遇到了一个问题。上的文档没有提供足够的信息,因此在这方面没有真正的用处

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


我正在存储一个指针,指向C++类的实例(实例实现了插件的功能),在NPP的NPDPY()中的PPDATA成员中。p> 我想我在回答我自己的问题

我找到的解决方案(我仍然希望对它的有效性发表评论,特别是如果你认为有更好的方法的话)是分配一个NPObject派生的结构,该结构在我从插件向Firefox公开的allocate()函数中有一个指向我的实现类的指针。然后,我在NPP的pdata成员NPP_New()中存储指向该NPObject的指针

在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;

}我想我是在回答我自己的问题

我找到的解决方案(我仍然希望对它的有效性发表评论,特别是如果你认为有更好的方法的话)是分配一个NPObject派生的结构,该结构在我从插件向Firefox公开的allocate()函数中有一个指向我的实现类的指针。然后,我在NPP的pdata成员NPP_New()中存储指向该NPObject的指针

在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;

}

你基本上已经找到了答案。如果您愿意,您可以使用自己的对象来扩展NPObject,以使其更加友好和面向对象。你可以在FireBreath项目中找到一个很好的例子,我也建议你去看看。看,你基本上已经找到了答案。如果您愿意,您可以使用自己的对象来扩展NPObject,以使其更加友好和面向对象。你可以在FireBreath项目中找到一个很好的例子,我也建议你去看看。看见