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

3 firefox plugins freeze npapi

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

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

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

谢谢.

小智 6

我希望你已经解决了.如果不是这种情况,我刚刚发现这个例子(我认为这是该死的"npruntime样本")是有缺陷的.

在返回字符串时,该示例使用该函数strdup来分配使用NP_something方法传递的字符串.事实上,NPAPI从那一点开始处理分配的字符串,并且当试图销毁它时,它不能strdup使用malloc和不使用NPN_MemAlloc.

malloc对于我们传递给NPAPI函数的对象,解决方案永远不会使用或者是new.在npruntime示例中,错误位于第452行:

STRINGZ_TO_NPVARIANT(strdup("foo return val"), *result);
Run Code Online (Sandbox Code Playgroud)

和第466行:

STRINGZ_TO_NPVARIANT(strdup("default method return val"), *result);
Run Code Online (Sandbox Code Playgroud)

我用这段代码纠正了它:

char* src = "foo return val";
char* out = (char *)NPN_MemAlloc(strlen(src) + 1);
strcpy(out, src);
STRINGZ_TO_NPVARIANT(out, *result);
Run Code Online (Sandbox Code Playgroud)

它起作用了.但有人会认为样本中的这种缺陷应该由mozilla SDK维护者来纠正.