0%

NPAPI插件开发

NPAPI是大多数非IE浏览器(Chrome、Firefox、Safari等)都支持的一套插件接口规范,但网上能找到的资料较少,这篇文章旨在于记录一下NPAPI开发学习过程中遇到的问题。

开发学习过程中主要参考的文章如下:

总体上可以参考第一篇文章,但该作者后续的文章 插件脚本化(插件与js交互),写得比较模糊,若想使插件能与js交互,还是参考第二篇文章把SDK中的npruntime的编译跑起来了,再自己修改代码比较好。

开发过程中遇到了一些坑,记录如下。

首先npruntime这个样例在chrome下是会crash的,原因是代码中有两个 NPN_Evaluate 方法,其最后一个参数给的是NULL,这个在chrome下是有问题的,定义一个NPVariant result,把result作为最后一个参数,问题即可解决。

在插件中导入MFC库后,项目编译不起来,报LNK2005,因为crt的库和mfc的库冲突了,解决方案是强制将crt的库延迟导入编译。具体操作:在项目设置 “属性”-“链接器”-“输入”中,“忽略特定库”中添加 Nafxcw.lib、Libcmt.lib(Debug下是Nafxcwd.lib、Libcmtd.lib),再在 “附加依赖项”中加入这两个库。

然后是中文乱码问题,这里只说js向插件传递字符串参数的情况,这时传递进来的是UTF8编码的字符串,若项目是ANSI编码,需要先将参数转为UNICODE(WCHAR),再转回char。这个网上的资料很多,不再赘述。

上面提到的中文乱码解决后,但在chrome下还是有问题,直接输出来看的话会发现字符串最后多了些什么,这个问题很常见–字符串结尾少了个’\0’,因此方法是自己开个长度为 NPString.UTF8Length + 1 的 char buffer,把最后一位赋0即可。

js向插件传递字符串型参数的问题弄好后,传递整型参数又有问题了,同样的js代码,如 plugin.foo(4),在Firefox中会认为参数类型是 NPVariantType_Int32 , 而在Chrome中,类型是 NPVariantType_Double。