如何在NPAPI C插件中获取NPP实例

时间:2009-04-16 13:24:24

标签: c plugins npapi

我在C中编写了一个NPAPI插件,需要调用 NPN_Invoke 函数 (为了调用JavaScript函数)。

但是NPN_Invoke()将NPP实例作为参数。

只有NP_New()和NP_Destroy()函数才能通过NPP实例。我如何获得这个NPP实例?

提前致谢。

2 个答案:

答案 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。当你的回调被调用时,可以保存实例。