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