1. 准备工作

开发工具

本例使用的是visual studio 2008 英文版,下图是关于信息 关于信息

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。图中画红圈的代表需要填写或者需要选择的地方。

创建项目

新建项目 alt text

 

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

 

向导
alt text

 

选择Application typeDLL
选择Empty project
alt text

 

添加文件

首先,添加NPAPI SDK中的Common文件
alt text

 

一共3个文件
alt text

 

然后,添加def文件
alt text

 

命名最好与项目一致
alt text

 

编辑npdemo.def为

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

 

现在,添加资源
alt text

 

选择Version
alt text

 

自动生成了resource.hnpdemo.rc。由于要在版本信息中加项,所以手工npdemo.rc
alt text

 

选择“Y”
alt text

 

在图中的BLOCK中添加。注意!BLOCK 一定要是"040904e4
VALUE "MIMEType", "application/demo-plugin"
这里顺便说一下,MIMEType是plugin的唯一标示,需要自己定义
通常的格式是"application/“+ [plugin name]
本例中定义为"application/demo-plugin"
alt text

 

下面添加最关键的部分:Plugin实现类
alt text
alt text

 

类名可以随便起,本例命名为CPlugin
但是一定要继承自nsPluginInstanceBace
alt text

 

修改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() { }   

修改项目属性

 

打开项目属性 alt text

 

修改字符集设置为“Use Multi-Byte Character Set
alt text

 

添加搜索目录 “....\include”和“........\base\public
alt text

 

添加预编译宏 X86
alt text

编译调试

现在可以编译了!
本例编译后,在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

alt text

 

打开火狐浏览器 在地址栏输入“about:plugins” 如果在plugin列表中有本例的npdemo.dll及说明我们的plugin示例已经成功完成
alt text