3

NPAPI プラグインから Javascript に文字列の配列を返したい。現在、プレーンな NPAPI のみを使用しています。次のリンクを読みました。

プラグインから javascript に alert() を返すことができ、NPNVWindowObject を取得できますが、要素を配列にプッシュしてそれを javascript に返す方法を理解するのに苦労しています。

作業コードのサンプルをいただければ幸いです、ありがとう

4

1 に答える 1

5

あなたはすでに近づいています。いくつかの詳細を入力するだけです。FireBreathコードベースにはこれを行う例がありますが、実際の実装は少し抽象化されています。これを行う生の NPAPI コードはありません。私は FireBreath でプラグインを構築していますが、ほとんどばかばかしいほどシンプルです。ただし、何をする必要があるかは言えます。

いくつかのステップに分解すると、問題はより単純になります。

  1. ウィンドウの NPObject を取得します (このように聞こえます)。
  2. 新しい配列を作成し、その配列の NPObject を取得します
  3. DOM に送信するアイテムごとに、その NPObject で「プッシュ」を呼び出します
  4. 配列の NPObject を保持し、それを戻り値 NPVariant で返します

これらに使用するコードを突き刺します。小さな誤差があるかもしれません。

1) ウィンドウの NPObject を取得する

// Get window object.
NPObject* window = NULL;
NPN_GetValue(npp_, NPNVWindowNPObject, &window);
// Remember that when we're done we need to NPN_ReleaseObject the window!

2) 新しい配列を作成し、その配列の NPObject を取得します

基本的にこれを行うには window.Array() を呼び出します。これは、ウィンドウで Array を呼び出すことによって行います。

// Get the array object
NPObject* array = NULL;
NPVariant arrayVar;
NPN_Invoke(_npp, window, NPN_GetStringIdentifier("Array"), NULL, 0, &arrayVar);
array = arrayVar.value.objectValue;
// Note that we don't release the arrayVar because we'll be holding onto the pointer and returning it later

3) DOM に送信する各アイテムに対して、その NPObject で「プッシュ」を呼び出します

NPIdentifier pushId = NPN_GetStringIdentifier("push");
for (std::vector<std::string>::iterator it = stringList.begin(); it != stringList.end(); ++it) {
    NPVariant argToPush;
    NPVariant res;
    STRINGN_TO_NPVARIANT(it->c_str(), it->size(), argToPush);
    NPN_Invoke(_npp, array, pushId, &argToPush, 1, &res);
    // Discard the result
    NPN_ReleaseVariantValue(&res);
}

4) 配列の NPObject を保持し、それを戻り値 NPVariant で返します。

// Actually we don't need to retain the NPObject; we just won't release it. Same thing.
OBJECT_TO_NPVARIANT(array, *retVal);
// We're assuming that the NPVariant* param passed into this function is called retVal

それはほとんどそれを行う必要があります。メモリ管理のしくみを理解していることを確認してください。まだ読んでいない場合は、http://npapi.com/memoryを読んでください。

幸運を

于 2012-08-22T19:22:09.753 に答える