我正在尝试学习如何编写Firefox插件。 我从Mozilla下载了npruntime示例编译并运行它。 从插件获取属性效果很好,但是当我尝试时 调用方法,Firefox冻结了。 我想也许这个例子有问题,所以我编写了自己的基本脚本插件,它有一个属性和一个返回字符串的方法。 该属性运行良好,但调用该方法导致Firefox再次冻结。
我错过了什么吗? 我尝试调试插件,一切似乎都很好。好吧 调用函数并正确返回值。如果我在Firefox挂起时尝试停止该过程,我会停在Windows DLL上,而不是我的代码而不是Firefox代码。
如果有人能指出我正确的方向......
感谢。
答案 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的问题。 我不知道它会起作用,但值得尝试。