あなたはすでに近づいています。いくつかの詳細を入力するだけです。FireBreathコードベースにはこれを行う例がありますが、実際の実装は少し抽象化されています。これを行う生の NPAPI コードはありません。私は FireBreath でプラグインを構築していますが、ほとんどばかばかしいほどシンプルです。ただし、何をする必要があるかは言えます。
いくつかのステップに分解すると、問題はより単純になります。
- ウィンドウの NPObject を取得します (このように聞こえます)。
- 新しい配列を作成し、その配列の NPObject を取得します
- DOM に送信するアイテムごとに、その NPObject で「プッシュ」を呼び出します
- 配列の 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を読んでください。
幸運を