私はCでNPAPIプラグインを作成しました。これは、(JavaScript関数を呼び出すために)NPN_Invoke関数を呼び出す必要があります。
ただし、NPN_Invoke()はNPPインスタンスをパラメーターとして受け取ります。
NP_New()関数とNP_Destroy()関数のみがNPPインスタンスを通過します。このNPPインスタンスを取得するにはどうすればよいですか?
前もって感謝します。
私はCでNPAPIプラグインを作成しました。これは、(JavaScript関数を呼び出すために)NPN_Invoke関数を呼び出す必要があります。
ただし、NPN_Invoke()はNPPインスタンスをパラメーターとして受け取ります。
NP_New()関数とNP_Destroy()関数のみがNPPインスタンスを通過します。このNPPインスタンスを取得するにはどうすればよいですか?
前もって感謝します。
最善の方法は、実際には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, ...)
NP_GetEntryPointsで、独自のNP_yourNew関数を定義します。これで、NP_Newの後に、フレームワークがインスタンスを使用してNP_yourNewを呼び出します。コールバックが呼び出されたときにインスタンスを保存できます。