2011-06-30 5 views
3

NPAPIを使用してJavascriptでオブジェクトをコールバックしています。この呼び出しの前に、私が呼び出す関数がJavaScriptで関数を適切に呼び出す結果となりましたが、NPN_Invoke呼び出しでは失敗します。NPNInvoke - プラグインデータをブラウザに戻す

コードスニペット:

sBrowserFuncs->releaseobject(object_temp); 
object_temp = NPVARIANT_TO_OBJECT(args[0]); 
sBrowserFuncs->retainobject(object_temp); 

if (send_msg1(sBrowserFuncs, instance, msg_rcv, NPVARIANT_TO_OBJECT(args[0]), msg, name_id)) 

sendmsg1は、新しいスレッドを生成し、このスレッドはmsg_rcvバックを呼び出します。それは正常に生成されたスレッドがメインスレッド関数を呼び出すのは間違いの理由です。 は... NPN_Invokeへ 彼女の呼び出しはinstance object_temp

NPVariant from; 

STRINGZ_TO_NPVARIANT(sdata->from, from); 
NPIdentifier methodId = NPN_GetStringIdentifier("new_msg"); 
int res = NPN_Invoke(sdata->instance, object_temp, methodId, &from, 1, &result); 

sdata->instanceマッチと呼ばれて成功した場合には、それは1.

を返しながら、それは、0を返し

を格納された最後と呼ばれるオブジェクトでありますこの場合、NPN_Invokeは0を生成します。

答えて

2

私の知る限り、NPN_ *コールプラグインスレッドから発行する必要があります。 NPN_PluginThreadAsyncCallを確認できます。私はこの方法でメイン/プラグインスレッド上の別のスレッドからメソッドを実行し、不快なクラッシュを避けることができます:)

+0

これはまさに正しいことです。ただし、MacではPluginThreadAsyncCallが常に信頼できるとは限りません。プラットフォームによっては、他の回避策を使用する必要があります。これは、FireBreath(http://firebreath.org)フレームワークが非常に人気がある理由の1つです。なぜなら、このようなスレッド問題のほとんどすべてを抽象化しているからです。 – taxilian

関連する問題