1. 准备工作

开发工具

本例使用的是visual studio 2008 英文版,下图是关于信息 NPAPI开发详解,Windows版_第1张图片

Windows SDK

本例使用Windows7操作系统 这里下载SDK

NPAPISDK

本例使用的是Firefox4.0.1提供的SDK。

首先,从这里下载mozilla源码。然后,解压firefox-4.0.1.source.tar.bz2文件。

将 \firefox-4.0.1.source\mozilla-2.0\modules\plugin 目录解压缩出来,里面有我们开发NPAPI插件所需的所有资源。

为了方便大家使用,这里提供plugin.zip的下载。

本例将plugin目标解压到D:\code\下(后面统一使用绝对路径,以避免异意)

2. 创建Plugin

本着“有图有真相”的原则,下面将连续多图并配文字一步步创建、调试Plugin。图中画红圈的代表需要填写或者需要选择的地方。

创建项目

新建项目 NPAPI开发详解,Windows版_第2张图片

 

Name项一定要以np开头,为了将来适应不同操作系统,最好全小写,不要太长,尽量控制在8字符内。
本例定义为npdemo
Location项定义到plugin\sdk\samples以便项目属性中用相对路径引用NPAPI的SDK
本例定义为d:\code\plugin\sdk\samples
NPAPI开发详解,Windows版_第3张图片

 

向导
NPAPI开发详解,Windows版_第4张图片

 

选择Application typeDLL
选择Empty project
NPAPI开发详解,Windows版_第5张图片

 

添加文件

首先,添加NPAPI SDK中的Common文件
NPAPI开发详解,Windows版_第6张图片

 

一共3个文件
NPAPI开发详解,Windows版_第7张图片

 

然后,添加def文件
NPAPI开发详解,Windows版_第8张图片

 

命名最好与项目一致
NPAPI开发详解,Windows版_第9张图片

 

编辑npdemo.def为

LIBRARY "npdemo"  EXPORTS     NP_GetEntryPoints   @1     NP_Initialize       @2     NP_Shutdown         @3  

 

现在,添加资源
NPAPI开发详解,Windows版_第10张图片

 

选择Version
NPAPI开发详解,Windows版_第11张图片

 

自动生成了resource.hnpdemo.rc。由于要在版本信息中加项,所以手工npdemo.rc
NPAPI开发详解,Windows版_第12张图片

 

选择“Y”
NPAPI开发详解,Windows版_第13张图片

 

在图中的BLOCK中添加。注意!BLOCK 一定要是"040904e4
VALUE "MIMEType", "application/demo-plugin"
这里顺便说一下,MIMEType是plugin的唯一标示,需要自己定义
通常的格式是"application/“+ [plugin name]
本例中定义为"application/demo-plugin"
NPAPI开发详解,Windows版_第14张图片

 

下面添加最关键的部分:Plugin实现类
NPAPI开发详解,Windows版_第15张图片
NPAPI开发详解,Windows版_第16张图片

 

类名可以随便起,本例命名为CPlugin
但是一定要继承自nsPluginInstanceBace
NPAPI开发详解,Windows版_第17张图片

 

修改Plugin.h

#pragma once #include "pluginbase.h"  class CPlugin : public nsPluginInstanceBase { private:   NPP m_pNPInstance;   NPBool m_bInitialized; public:   CPlugin(NPP pNPInstance);   ~CPlugin();    NPBool init(NPWindow* pNPWindow)  {  m_bInitialized = TRUE;  return TRUE;}   void shut()  {  m_bInitialized = FALSE;  }   NPBool isInitialized()  {  return m_bInitialized;  } }; 

 

修改Plugin.cpp
其中实现了4个全局函数

#include "plugin.h"   ////// functions ///////// NPError NS_PluginInitialize() {   return NPERR_NO_ERROR; }  void NS_PluginShutdown() { }  nsPluginInstanceBase * NS_NewPluginInstance(nsPluginCreateData * aCreateDataStruct) {   if(!aCreateDataStruct)     return NULL;    CPlugin * plugin = new CPlugin(aCreateDataStruct->instance);   return plugin; }  void NS_DestroyPluginInstance(nsPluginInstanceBase * aPlugin) {   if(aPlugin)     delete (CPlugin *)aPlugin; } ////// CPlugin ///////// CPlugin::CPlugin(NPP pNPInstance) : nsPluginInstanceBase(),   m_pNPInstance(pNPInstance),   m_bInitialized(FALSE) { }  CPlugin::~CPlugin() { }   

修改项目属性

 

打开项目属性 NPAPI开发详解,Windows版_第18张图片

 

修改字符集设置为“Use Multi-Byte Character Set
NPAPI开发详解,Windows版_第19张图片

 

添加搜索目录 “....\include”和“........\base\public
NPAPI开发详解,Windows版_第20张图片

 

添加预编译宏 X86
NPAPI开发详解,Windows版_第21张图片

编译调试

现在可以编译了!
本例编译后,在D:\code\plugin\sdk\samples\npdemo\Debug生成npdemo.dll

打开注册表,在HKEYLOCALMACHINE\SOFTWARE\MozillaPlugins下新建子项@mozilla.com.cn/demo
并新建字符串数据“Path”设值为D:\code\plugin\sdk\samples\npdemo\Debug\npdemo.dll

NPAPI开发详解,Windows版_第22张图片

 

打开火狐浏览器 在地址栏输入“about:plugins” 如果在plugin列表中有本例的npdemo.dll及说明我们的plugin示例已经成功完成
NPAPI开发详解,Windows版_第23张图片