如何比较NPVariant对象?

时间:2012-10-18 08:40:16

标签: npapi

我正在将注册表从JS注册到NPAPI插件。 为了不多次注册同一个监听器,我需要一种方法来比较传递的NPVariant对象与列表中已有的对象。

这就是我从JS注册听众的方式:

    PluginObject.registerListener("event", listener);

然后在插件源中:

    for (l=head; l!=NULL; l=l->next) {
      // somehow compare the listeners
      // l->listener holds NPVariant object
      if (l->listener-> ??? == new_lle->listener-> ???) 
      {
        found = 1;
        DBG("listener is a duplicate, not adding.");
        NPN_MemFree(new_lle->listener);
        free(new_lle);
        break;
      } 
    }

2 个答案:

答案 0 :(得分:0)

当你谈论一个javascript函数时,NPVariant只是一个NPObject。

typedef struct _NPVariant {
  NPVariantType type;
  union {
    bool boolValue;
    int32_t intValue;
    double_t doubleValue;
    NPString stringValue;
    NPObject *objectValue;
  } value;
} NPVariant;

比较val.type和val.objectValue。这通常会起作用,但如果没有,那就没有其他方法,所以你最好还是尝试一下。我猜另一种可能性是创建一个javascript函数来比较它们,用NPN_Evaluate注入它并用两个对象调用它。

答案 1 :(得分:0)

我认为你不能依赖objectValue。例如,如果您执行以下操作:

foo={}; bar=foo; x={};
x.f=foo; x.b=bar;

现在,如果您调用NPN_Enumerate并将x作为NPObject传递,则会获得两个标识符。为每个调用GetProperty返回NPVariants,但variant->value.objectValue的值对于每个都是不同的,并且在后续调用NPN_Enumerate时会再次不同。

taxilian:使用两个NPObject调用NPN_Invoke是否有很大的开销,只是为了测试相等性?这也涉及对GetProperty的一些调用以及标识符的创建和调用NPVARIANT宏以测试结果等。我想知道我应该在Javascript中注入和评估多少逻辑..这段代码注入似乎一次又一次地提出解决方案。这是否代价高昂?