1 NPAPI插件
1.1 NPAPI简介
NPAPI(Netscape Plugin Application Programming Interface,网景插件应用程序接口)是网景公司当年制定的开发基于网景浏览器,用于在浏览器中执行外部应用程序的通用接口。该接口基于插件机制,制定了一系列的标准和API,因此也有NPAPI插件一说。同期的微软,也在IE中支持ActiveX为浏览器插件,不得不承认微软在这一点上,把浏览器和OS结合的更为紧密,这也可能是当年微软能够击溃网景的原因之一。
但网景的影响深远,除了微软特立独行之外,其他浏览器开发厂商奇迹般的都一致采用了NPAPI来对浏览器进行扩展(这包括后来从灰烬中重生的FireFox及新生的Chrome;当然,Chrome在不久前时间已经在尝试抛弃NPAPI了)。因此,在目前来看NPAPI几乎是IE之外的浏览器插件开发的统一标准。
1.2 准备工作
根据参考资料,从ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/4.0.1/source/中下载了firefox早期的源代码,并从中抠出了NPAPI相关的部分(恩,资料上说的不够详细)。
解压源代码,把modules\plugin\base\public和modules\plugin\sdk\samples\include两个目录中的文件复制出来放在一起(我创建了D:\npapi,把文件都放这了)。
另外,资料里提到的三个文件在modules\plugin\sdk\samples\common下(记住位置,待会会用到)。
1.3 创建插件
顺便提一下,本文以VS2003为范例。
插件实现的功能:对浏览器(贴切点说是对javascript引擎)暴露对象Sample,而Sample又提供了一个sayHello的方法。这样一来,我们可以在浏览器中,使用javascript通过Sample.sayHello();来调用插件所提供的功能。
1.3.1 创建Win32 DLL工程
1.3.2 引入NPAPI库
在工程属性中,添加“附加包含目录”:D:\npapi(之前抠出来的部分)。
1.3.3 添加宏定义_X86_
1.3.4 添加模块定义文件(.def文件)
创建sample.def文件,内容为:
LIBRARY"sample"
EXPORTS
NP_GetEntryPoints @1
NP_Initialize @2
NP_Shutdown @3
1.3.5 编辑stdafx.h文件
增加tchar头文件的引入:
#include<tchar.h>
增加NPAPI头文件的引入:
//Mozilla-API
#include<npfunctions.h>
#include<npruntime.h>
#include"npruntime.h"
1.3.6 添加基础框架文件
找到np_entry.cpp、npn_gate.cpp和npp_gate.cpp,复制到工程目录下,并添加到工程(恩恩,位置在modules\plugin\sdk\samples\common)。
在编辑器里分别打开着三个文件,并在文件头部加入:
#include"stdafx.h"
1.3.7 编辑sample.cpp文件
将文件代码修改为:
#include"stdafx.h"
#include"sample.h"
NPErrorNS_PluginInitialize()
{
return NPERR_NO_ERROR;
}
voidNS_PluginShutdown()
{
}
nsPluginInstanceBase* NS_NewPluginInstance(nsPluginCreateData * aCreateDataStruct)
{
if(!aCreateDataStruct)
return NULL;
CPlugin* plugin = newCPlugin(aCreateDataStruct->instance);
return plugin;
}
voidNS_DestroyPluginInstance(nsPluginInstanceBase * aPlugin)
{
if(aPlugin