我在C中编写了一个NPAPI插件,需要调用 NPN_Invoke 函数 (为了调用JavaScript函数)。
但是NPN_Invoke()将NPP实例作为参数。
只有NP_New()和NP_Destroy()函数才能通过NPP实例。我如何获得这个NPP实例?
提前致谢。
答案 0 :(得分:2)
最好的方法是使用字段扩展NPObject以保存关联的NPP实例,并使用NPClass定义提供allocate / deallocate函数。然后,您可以将NPObject强制转换为子类型以访问实际的NPP实例。
我会不建议在全球范围内执行此操作(NP_GetEntryPoints等),如上所述,因为您的插件可能有多个实例加载 - 甚至可能在同一页面上 - 而您我想确保你正在调用正确的。不幸的是,似乎有很多示例代码,其中一些随机实例只保存在一个全局变量中,并尽可能地更新。
例如,假设使用C ++,您将需要扩展NPObject:
struct MyNPObject : public NPObject {
NPP npp_;
explicit MyNPObject(NPP npp) : npp_(npp) {}
};
然后你的NPClass定义需要分配和释放定义:
static NPClass obj_Class = {
NP_CLASS_STRUCT_VERSION,
&obj_allocate,
&obj_deallocate,
NULL,
&obj_hasMethod,
&obj_invoke,
...
可以像这样实施:
static NPObject* obj_allocate(NPP npp, NPClass *aClass)
{
return new MyNPObject(npp);
}
static void obj_deallocate(NPObject *obj)
{
delete obj;
}
当你需要调用NP_Invoke时,假设你有NPObject *(例如在obj_invoke中),你只需要向下转换:
MyNPObject* myObj = reinterpret_cast<MyNPObject*>(obj);
g_browser->invoke(myObj->npp, ...)
答案 1 :(得分:1)
在NP_GetEntryPoints中定义你自己的NP_yourNew函数,现在当NP_New之后,框架用实例调用你的NP_yourNew。当你的回调被调用时,可以保存实例。