2

私はCでNPAPIプラグインを作成しました。これは、(JavaScript関数を呼び出すために)NPN_Invoke関数を呼び出す必要があります。

ただし、NPN_Invoke()はNPPインスタンスをパラメーターとして受け取ります。

NP_New()関数とNP_Destroy()関数のみがNPPインスタンスを通過します。このNPPインスタンスを取得するにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

2

最善の方法は、実際にはNPObjectをフィールドで拡張して、関連付けられたNPPインスタンスを保存し、NPClass定義で割り当て/割り当て解除関数を提供することです。次に、NPObjectをサブタイプにキャストして、実際のNPPインスタンスにアクセスできます。

上記のようにグローバルレベル(NP_GetEntryPointsなど)でこれを行うことはお勧めしません。プラグインのインスタンスが複数ロードされている可能性があり、同じページにある場合でも、正しいものを呼び出していることを確認する必要があるためです 1。残念ながら、いくつかのランダムなインスタンスがグローバル変数に保持され、可能な限り更新されるサンプルコードがたくさんあるようです。

例として、C ++を想定すると、NPObjectを拡張する必要があります。

struct MyNPObject : public NPObject {
  NPP npp_;
  explicit MyNPObject(NPP npp) : npp_(npp) {}
};

次に、NPClass定義に定義の割り当てと割り当て解除を行う必要があります。

static NPClass obj_Class = {
  NP_CLASS_STRUCT_VERSION,
  &obj_allocate,
  &obj_deallocate,
  NULL,
  &obj_hasMethod,
  &obj_invoke,
  ...

これは次のように実装できます:

static NPObject* obj_allocate(NPP npp, NPClass *aClass)
{
  return new MyNPObject(npp);
}

static void obj_deallocate(NPObject *obj)
{
  delete obj;
}

また、NP_Invokeを呼び出す必要がある場合、NPObject *(たとえば、obj_invoke内)があると仮定すると、次のようになります。

MyNPObject* myObj = reinterpret_cast<MyNPObject*>(obj);
g_browser->invoke(myObj->npp, ...)
于 2011-10-22T23:45:28.070 に答える
1

NP_GetEntryPointsで、独自のNP_yourNew関数を定義します。これで、NP_Newの後に、フレームワークがインスタンスを使用してNP_yourNewを呼び出します。コールバックが呼び出されたときにインスタンスを保存できます。

于 2009-06-24T11:22:43.090 に答える