我遇到了一个问题,即我正在使用相应的插件实例编写插件中的调用方法。 http://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins上的文档没有提供足够的信息来对此真正有用。
简而言之,我试图了解插件应该返回哪个脚本对象以响应对NPP_GetValue的调用,其变量参数等于NPPpluginScriptableNPObject。我猜测插件的每个实例都应该有一个NPObject实例,但是NPClass中的invoke()方法应该如何从作为参数给出的可编写脚本的NPObject中找到插件实例(NPP)?我想我可以实现一个查找表来做到这一点,但我感觉有一些显而易见的东西我不知道。
我正在NPP_New()中的NPP的pdata成员中存储指向C ++类实例的指针(该实例实现了插件的功能)。
答案 0 :(得分:1)
我想我正在回答我自己的问题......
我找到的解决方案(我仍然会感谢有关它的有效性的评论,特别是如果你认为有更好的方法)是分配一个NPObject派生结构,该结构在allocate()中有一个指向我的实现类的指针函数我从我的插件中暴露给Firefox。然后,我在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;
}