Firefox [npapi] 插件开发 - 调用方法时 Firefox 冻结
Posted
技术标签:
【中文标题】Firefox [npapi] 插件开发 - 调用方法时 Firefox 冻结【英文标题】:Firefox [npapi] plugin development - firefox freeze when calling a method 【发布时间】:2009-09-16 07:04:59 【问题描述】:我正在尝试学习如何编写 Firefox 插件。 我从 Mozilla 下载了 npruntime 示例,编译并运行它。 从插件中获取属性效果很好,但是当我尝试 调用一个方法,Firefox 冻结。 我想这个例子可能有问题,所以我编写了自己的基本可脚本化插件,它有一个属性和一个返回字符串的方法。 该属性运行良好,但调用该方法导致 Firefox 再次冻结。
我错过了什么吗? 我尝试调试插件,一切似乎都很好。没事 函数被调用并正确返回值。如果我在 Firefox 挂起时尝试停止进程,我会在 Windows DLL 处停止,而不是在我的代码中,也不是在 Firefox 代码中。
如果有人能指出我正确的方向......
谢谢。
【问题讨论】:
【参考方案1】:我希望你已经解决了。如果不是这种情况,我刚刚发现该示例(我假设那是该死的“npruntime 示例”)存在缺陷。
在返回字符串时,该示例使用函数strdup
分配通过NP_something 方法传递的字符串。
事实是 NPAPI 从那时起负责处理分配的字符串,当试图销毁它时,它不能因为strdup
使用malloc
而不是NPN_MemAlloc
。
解决方案是永远不要将malloc
或 new 用于我们传递给 NPAPI 函数的对象。
在 npruntime 示例中,错误位于第 452 行:
STRINGZ_TO_NPVARIANT(strdup("foo return val"), *result);
和第 466 行:
STRINGZ_TO_NPVARIANT(strdup("default method return val"), *result);
我已经用这段代码更正了它:
char* src = "foo return val";
char* out = (char *)NPN_MemAlloc(strlen(src) + 1);
strcpy(out, src);
STRINGZ_TO_NPVARIANT(out, *result);
它奏效了。 但有人会认为,mozilla SDK 维护人员应该纠正样本中的这种缺陷。
【讨论】:
好发现!您能否找到一个错误 -- bugzilla.mozilla.org/… 如果人们在几周内没有反应,请尝试找到合适的人来查看它(例如通过在 irc.mozilla.org/developers 中四处询问)? 嘿,谢谢!我们的一位开发人员提交了一个错误,并在其中提供了一个包含您的修复的补丁。如果您想获得命名功劳,请输入错误并说出您的姓名。 bugzilla.mozilla.org/show_bug.cgi?id=530138【参考方案2】:我为每个浏览器开发了 npruntime。 它在所有浏览器中运行良好,但 firefox 仅在 Windows 7 中冻结。
我解决了将 firefox 配置“dom.ipc.plugins.enabled”编辑为 false 的问题。 我不知道它会起作用,但值得一试。
【讨论】:
以上是关于Firefox [npapi] 插件开发 - 调用方法时 Firefox 冻结的主要内容,如果未能解决你的问题,请参考以下文章