1

現在のページの DOM にアクセスするための NPAPI プラグインを作成しています。私はプラグインを構築することができます。今、私は javascript 関数 console.debug("hello from c++"); を呼び出したいです。NPAPI プラグインから。次のコードを取得しました。Google の helloworld サンプル コードを使用して npapi プラグインをビルドしています。コード:

bool ScriptablePluginObject::Invoke(NPObject* obj, NPIdentifier methodName, const NPVariant* args,uint32_t argCount, NPVariant* result) 
{   
   // The message i want to send.
   char* message = "Hello from C++";

   // Get window object.
   NPObject* window = NULL;
   NPN_GetValue(npp_, NPNVWindowNPObject, &window);

   // Get console object.
   NPVariant consoleVar;
   NPIdentifier id = NPN_GetStringIdentifier("console");
   NPN_GetProperty(npp_, window, id, &consoleVar);
   NPObject* console = NPVARIANT_TO_OBJECT(consoleVar);

   // Get the debug object.
   id = NPN_GetStringIdentifier("debug");

   // Invoke the call with the message!
   NPVariant type;
   STRINGZ_TO_NPVARIANT(message, type);
   NPVariant args[] = { type };
   NPVariant voidResponse;
   NPN_Invoke(npp_, console, id, args,sizeof(args) / sizeof(args[0]),&voidResponse);

   // Cleanup all allocated objects, otherwise, reference count and
   // memory leaks will happen.
   NPN_ReleaseObject(window);
   NPN_ReleaseVariantValue(&consoleVar);
   NPN_ReleaseVariantValue(&voidResponse);
}

しかし、test.htmlを呼び出しているときにロードした後、クラッシュしています。「このコードを正しい場所で呼び出していますか」と「このコードをテストするにはどうすればよいですか」を教えてください。

ありがとう...

4

2 に答える 2

2

まず第一に、「クラッシュしました」と読んだときはいつでも、それ以上の情報がなくても、少し顔をしかめる必要があります。それがすべてわかっている場合は、トラブルシューティングをすぐにやめたことになります。FireBreath プロジェクトにはプラグインのデバッグに関するページがあり、役立つかもしれませんが、デバッガーが接続されている間にクラッシュさせた場合は、クラッシュした場所とクラッシュの原因を特定する必要があります。

また、本番環境で行っていることを実行しようとすると、重大なパフォーマンスの問題が発生したことを警告したいと思います。これをメインのロギング方法として使用しないでください! それには十分な速さではありません。

とはいえ、ほとんどの場合、あなたのアプローチに本質的に問題があるとは思いません。あなたの(おそらくグローバル)npp_が有効でないか、NPN_MemAllocによって割り当てられたメモリで文字列を構成する必要がある可能性があります。あなたがそれを返すならそうする必要があることは知っていますが、新しい関数を呼び出すだけの場合はそうする必要はないと思います。ただし、試してみる必要があります。

もし私があなたなら、次のステップは、デバッガーを接続してクラッシュの場所を確認することです。これを行う最も簡単な方法は、おそらく Firefox でプラグイン ipc をオフにして、プロセスに簡単にアタッチできるようにすることですが、正しいプロセスを見つけて接続することもできます (詳細については、以前にリンクしたデバッグ ページを参照してください)。

于 2013-08-18T20:51:39.607 に答える