我已经编写了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时,它正在崩溃。 请让我知道“我在正确的地方调用此代码”和“我该如何测试此代码”。
感谢...
答案 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