代码之家  ›  专栏  ›  技术社区  ›  DEzra

如何获取NPAPIC插件中的NPP实例

  •  2
  • DEzra  · 技术社区  · 15 年前

    我在C中编写了一个NPAPI插件,它需要调用 NPN_Invoke 功能 (以便调用javascript函数)。

    但是npn_invoke()接受 NPP 实例作为参数。

    只有np_new()和np_destroy()函数得到传递的npp实例。如何获取这个NPP实例?

    事先谢谢。

    2 回复  |  直到 13 年前
        1
  •  1
  •   atVelu    15 年前

    在np的getentrypoints中定义自己的np\u your new函数,现在当np\u新建之后,框架用实例调用np\u your new。当您的回调刚刚被调用时,可以保存该实例。

        2
  •  2
  •   Dan Walters    13 年前

    最好的方法实际上是用一个字段扩展npobject以保存相关的npp实例,并为npclass定义提供allocate/deallocate函数。然后,可以将NP对象强制转换为子类型以访问实际的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, ...)