Firefox [npapi]插件开发 - 调用方法时firefox冻结

时间:2009-09-16 07:04:59

标签: firefox plugins freeze npapi

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

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

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

感谢。

2 个答案:

答案 0 :(得分:6)

我希望你已经解决了。如果情况并非如此,我刚刚发现这个例子(我认为这是该死的“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维护者来纠正。

答案 1 :(得分:0)

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

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