3

我正在尝试学习如何编写 Firefox 插件。我从 Mozilla 下载了 npruntime 示例,编译并运行它。从插件中获取属性效果很好,但是当我尝试调用一个方法时,Firefox 冻结了。我想这个例子可能有问题,所以我编写了自己的基本可脚本化插件,它有一个属性和一个返回字符串的方法。该属性运行良好,但调用该方法导致 Firefox 再次冻结。

我错过了什么吗?我尝试调试插件,一切似乎都很好。调用所有正确的函数并正确返回值。如果我在 Firefox 挂起时尝试​​停止进程,我会在 Windows DLL 处停止,而不是在我的代码中,也不是在 Firefox 代码中。

如果有人能指出我正确的方向......

谢谢。

4

2 回答 2

6

我希望你已经解决了。如果不是这种情况,我刚刚发现该示例(我假设那是该死的“npruntime 示例”)存在缺陷。

在返回一个字符串时,该示例使用该函数strdup分配一个通过 NP_something 方法传递的字符串。事实是 NPAPI 从那时起处理分配的字符串,并且当试图销毁它时,它不能因为strdupusesmalloc和 not NPN_MemAlloc

解决方案是永远不要使用malloc或新建我们传递给 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 维护人员应该纠正样本中的这种缺陷。

于 2009-10-27T16:29:36.640 回答
0

我为每个浏览器开发了 npruntime。它在所有浏览器中运行良好,但 Firefox 仅在 Windows 7 中冻结。

我解决了将 firefox 配置“dom.ipc.plugins.enabled”编辑为 false 的问题。我不知道它会起作用,但它值得一试。

于 2013-06-17T09:37:11.830 回答