1

我正在编写 NPAPI 插件来访问当前页面的 DOM。我能够构建插件。现在我想调用 javascript 函数 console.debug("hello from 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 时加载后它崩溃了。请让我知道“我是否在正确的位置调用此代码”和“我如何测试此代码”。

谢谢...

4

2 回答 2

2

第一件事是第一件事:每当我读到“它崩溃了”而没有更多信息时,我都不得不面对一下。如果这就是您所知道的,那么您过早地停止了故障排除。FireBreath项目有一个关于调试插件的页面可能会有所帮助,但是如果您在连接调试器时让它崩溃,您应该找出它崩溃的位置以及崩溃的原因。

我还想警告您,尝试在生产环境中执行您正在执行的操作时遇到了一些严重的性能问题;不要将此作为您的主要记录方法!这还不够快。

也就是说,在大多数情况下,我认为您的方法没有任何本质上的错误。可能是您的(可能是全局的)npp_无效,或者您的字符串可能需要由 NPN_MemAlloc 分配的内存组成;我知道如果您要返回它,那么它需要是,但我认为当您只是调用一个新函数时不需要它;不过,这是值得尝试的。

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

于 2013-08-18T20:51:39.607 回答
0

谢谢出租车司机...

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

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

于 2013-08-19T20:09:49.583 回答