我正在将注册表从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;
}
}
答案 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中注入和评估多少逻辑..这段代码注入似乎一次又一次地提出解决方案。这是否代价高昂?