这是我试图从 javascript 做的事情:
var result;
result = document.myplugin.GetClientName();
document.write(result);
“GetClientName”应该用一个字符串向浏览器返回一个 NPVariant。我得到我的输出,最后附加了垃圾。
有没有人对如何解决这个问题有任何建议?
这是我试图从 javascript 做的事情:
var result;
result = document.myplugin.GetClientName();
document.write(result);
“GetClientName”应该用一个字符串向浏览器返回一个 NPVariant。我得到我的输出,最后附加了垃圾。
有没有人对如何解决这个问题有任何建议?
嗯……做得对吗?您没有提供任何示例代码,也没有解释如何分配 NPVariant;我的朋友,这很难帮助你。
基本上,您只需要创建一个 NPVariant,使用NPN_MemAlloc为其分配足够的内存,并将指针分配给 NPVariant 联合内的 NPString 的 UTF8Characters 字段,并将长度分配给 UTF8Length。
确保分配内存并复制字符串;如果您尝试从 std::string 或其他可能在使用它之前释放的东西传递内存,这很容易导致问题。还要记住在字符串末尾为 NULL 字符分配一个额外的字节——记住 C 字符串是 NULL 终止的,虽然 NPAPI 规范说你只需要设置 UTF8Length,但我仍然看到 Firefox 的情况特别是期望一个 NULL 终止的字符串,如果你不给它一个,它的行为就会很奇怪。
如果你想走这条路,你可能会发现这篇博文很有帮助:
但是,我可以建议一条更简单的路线吗?编写一个 NPAPI 插件并不是一件简单的事情,需要大量的经验和研究才能做好并且安全地完成。如果您使用FireBreath,您可以在 C++ 框架上编写 NPAPI 插件,该框架已经为您完成了所有这些工作,并允许您使用普通的 C++ STL 数据类型,在多个平台上工作,并且通常可以为您节省大量时间和麻烦。
有关 FireBreath 使用脚本编写方法的一些信息,请参阅我关于该主题的博客文章。