浅析插件开发 之ActiveX与NPAPI异同

日期:2015-07-20点击次数:9461

        最近迁移ActiveX控件到Chrome平台,Chrome插件使用的是NPAPI框架,这是种轻量级框架,主要使用在以WebKit为核心的浏览器中,支持的浏览器有Chrome,Firefox,Safari等,说它是轻量级,主要因为是它与操作系统耦合性低,不像ActiveX,ActiveX控件的基础是COM,这是微软操作系统的核心组件,所以,ActiveX这套东西很难移植到其他操作系统中。ActiveX控件只能使用在IE中,而NPAPI占绝大多数。比较这两种开发框架,觉得还是NPAPI比较容易入手,ActiveX要吃透的话,几年都下不来。现把开发中异同总结如下:
        1.  使用的基础框架
        ActiveX控件可以使用WIN32 SDK,MFC,ATL开发,生成的控件大小以WIN32 SDK最小,ATL次之,MFC的最大。比如,改造后的NPAPI插件Debug版本只有1M多点,而改造之前的ActiveX控件却达到10M多,因为静态链接了MFC库的原因。
NPAPI使用WIN32 SDK开发,不能直接使用MFC,ATL,所以,如果要从以MFC开发的ActiveX改造成NPAPI插件,界面部分要重新开发过,里面的MFC类也不能使用。
       使用 MFC开发的好处是,资源(比如画刷,画笔,字体)不容易泄露,而使用原生SDK开发的程序,使用完资源后,如果不关闭,将造成句柄泄露。还有一个原因,就是原生SDK不容易使用,控件自绘也不容易实现,需吃透Windows消息,开发效率低。如果要同时兼顾IE和Chrome,宜用WIN32 SDK,不会给以后改造造成麻烦。
        2.  与JavaScript通信
       在接口生成方面,基本相同,在JS中调用也基本一致。参数都使用Variant变量,以方便脚本语言使用。区别在于在接口中返回数组,在ActiveX中使用了         SafeArray,而在NPAPI中使用了EVAL函数,直接生成数组。 所以在浏览器脚本接收数组时有点小区别。
       在事件处理方面不一样,ActiveX控件使用attachEvent或者直接使用<script type="text/javascript" for="video" event="*** ">,而如果要在NPAPI中接收事件,要自己实现attachEventListener和removeEventListerner,或者使用GetUrl直接回调JavaScript函数,但此种方法只适合简单数据类型,对于复杂类型(如数组,对象)不适用。
       无论是ActiveX还是NPAPI,在C代码中都是可以调用JS的,这个毋庸置疑,但在JS代码中不能做很复杂的事情,否则,整个控件将被挂起,不能响应事件。
       3.  安装方法
       ActiveX安装比较简单,
       第一种:可以在JS中使用如下形式进行提示安装
       例如:<object id="video" classid="clsid:30B8899E-450F-40BB-B654-DFED410352C8" width="640" height="480"     CODEBASE="http://192.168.0.103/KsVideo.cab#Version=1,0,0,1">,但要注意cab包不能过大,否则不容易安装成功。
       第二种:可以手动安装,解压cab包,然后使用regsvr32.exe注册。
       第三种:就是通过网页下载后,使用安装包安装。
而NPAPI安装更简单:
       第一种:在注册表中找到MozillaPlugins项,新建一个Key:path,把插件的绝对路径添上就行了,这样不管是Firefox还是Chrome都能正确加载插件。
       第二种:就是通过网页下载后,使用安装包安装。






 软件部       向国春