NPN_Invoke関数 (JavaScript関数を呼び出すために)を呼び出す必要があるCでNPAPIプラグインを作成しました。NPAPI Cプラグイン内でNPPインスタンスを取得する方法
しかしNPN_Invoke()はNPPインスタンスをパラメータとして受け取ります。
NP_New()とNP_Destroy()関数だけがNPPインスタンスを渡します。このNPPインスタンスを取得するにはどうすればよいですか?
ありがとうございます。
NPN_Invoke関数 (JavaScript関数を呼び出すために)を呼び出す必要があるCでNPAPIプラグインを作成しました。NPAPI Cプラグイン内でNPPインスタンスを取得する方法
しかしNPN_Invoke()はNPPインスタンスをパラメータとして受け取ります。
NP_New()とNP_Destroy()関数だけがNPPインスタンスを渡します。このNPPインスタンスを取得するにはどうすればよいですか?
ありがとうございます。
NP_GetEntryPointsでは独自のNP_yourNew関数を定義しています。NP_Newの後に、このフレームワークはインスタンスでNP_yourNewを呼び出します。あなたのコールバックがちょうど呼び出されるとインスタンスが保存される可能性があります。
実際には、関連付けられたNPPインスタンスを保存するフィールドを持つNPObjectを拡張し、NPClass定義でallocate/deallocate関数を提供することをお勧めします。次に、NPObjectをサブタイプにキャストして、実際のNPPインスタンスにアクセスできます。
上記示唆したように私はは、ロードされたプラグインの複数のインスタンス潜在的に存在しているとして、グローバルレベル(NP_GetEntryPointsなど)でこれをやってお勧めしません - 多分同じページには - あなたはことを確認したいですあなたは正しいものを呼び出しています。残念ながら、いくつかのランダムインスタンスがグローバル変数に保持され、できるだけ更新されているサンプルコードがたくさんあるようです。一例として、
、あなたがNPObjectを拡張したいと思う、C++を想定して:
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を呼び出す必要がある場合は、hあなただけのダウンキャスト(例えば、obj_invoke内)NPObject *をaveの:
MyNPObject* myObj = reinterpret_cast<MyNPObject*>(obj);
g_browser->invoke(myObj->npp, ...)
あなたは下、Mozillaのコードベースでこの良い例を見つけることができます:モジラ・中央/モジュール/プラグイン/ SDK /サンプル/のNPRuntime。 FireBreathプロジェクト(http://www.firebreath.org)で、完全に実装されたプラグインフレームワークの例をチェックすることもできます。サンプルプロジェクトの1つでnp_winmain.cppを起動し、src/NpapiPluginプロジェクトを見ます – taxilian