2

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;
      } 
    }
4

2 に答える 2

0

objectValue に頼ることはできないと思います。たとえば、次のようにすると:

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

ここで、NPN_Enumeratex を NPObject として呼び出して渡すと、2 つの識別子が得られます。これらのそれぞれに対して GetProperty を呼び出すと NPVariant が返されますが、 の値はvariant->value.objectValueそれぞれで異なり、その後の の呼び出しでも異なりますNPN_Enumerate

taxian: NPN_Invoke2 つの NPObjects を呼び出すと、等しいかどうかをテストするためだけにかなりのオーバーヘッドが発生しますか? これにはGetProperty、識別子の呼び出しと作成、NPVARIANT マクロを呼び出して結果をテストすることなども含まれます。Javascript でどれだけのロジックを注入して評価する必要があるのか​​ 疑問に思っています。何度でも解決。費用はかかりますか?

于 2012-10-19T06:51:25.033 に答える
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 を比較します。これは通常はうまくいきますが、うまくいかない場合は他に方法がないので、試してみたほうがよいでしょう。もう1つの可能性は、JavaScript関数を作成してそれらを比較し、NPN_Evaluateで注入して、2つのオブジェクトで呼び出すことだと思います。

于 2012-10-18T18:33:37.883 に答える