从NPAPI插件调用javascript函数

时间:2013-08-18 13:25:22

标签: javascript google-chrome dom npapi

我已经编写了NPAPI插件来访问当前页面的DOM。我能够构建插件。现在 我想调用javascript函数console.debug(“你好,来自c ++”);来自NPAPI插件。我已经采取了以下代码 我正在使用谷歌的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时,它正在崩溃。 请让我知道“我在正确的地方调用此代码”和“我该如何测试此代码”。

感谢...

2 个答案:

答案 0 :(得分:2)

第一件事是第一件事:每当我读到“它崩溃”而没有更多的信息时,我不得不面对一点点。如果这就是你所知道的,那么你很快就会停止排除故障。 FireBreath project有一个page on debugging plugins可能会有所帮助,但是如果你在连接调试器时让它崩溃,你应该找出它崩溃的地方以及崩溃的原因。

我还想警告你,我在尝试做你在生产环境中做的事情时遇到了一些重大的性能问题;不要将它用作主要的日志记录方法!它还不够快。

尽管如此,我认为你的方法在很大程度上没有任何内在错误。可能是您的(可能是全局的)npp_无效,或者您的字符串可能需要由NPN_MemAlloc分配的内存组成;我知道,如果你要归还它,那么它就需要,但我不认为它只是在你刚刚调用一个新函数时;不过,这是值得尝试的东西。

如果我是你,我的下一步是附加调试器并查看崩溃的位置。最简单的方法是关闭firefox中的插件ipc,这样你就可以轻松地连接到进程,但你也可以找到正确的进程并连接到它(请参阅我之前链接的调试页面以获取详细信息)< / p>

答案 1 :(得分:0)

感谢taxilian ......

你的建议有所帮助。我调试了chrome.exe并发现了npnfuncs结构的问题。空结构导致了这个问题。很少有代码更改有助于解决此问题。 chrome可以使用(对于其他可能想尝试的人)调试

C:\ Program Files \ Google \ Chrome \ Application&gt; chrome.exe --plugin-startup-dialog --wait-for-debugger

相关问题