1. 準(zhǔn)備工作

開(kāi)發(fā)工具

本例使用的是visual studio 2008 英文版,下圖是關(guān)于信息 關(guān)于信息

Windows SDK

本例使用Windows7操作系統(tǒng) 這里下載SDK

NPAPISDK

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

首先,從這里下載mozilla源碼。然后,解壓firefox-4.0.1.source.tar.bz2文件。

將 \firefox-4.0.1.source\mozilla-2.0\modules\plugin 目錄解壓縮出來(lái),里面有我們開(kāi)發(fā)NPAPI插件所需的所有資源。

為了方便大家使用,這里提供plugin.zip的下載。

本例將plugin目標(biāo)解壓到D:\code\下(后面統(tǒng)一使用絕對(duì)路徑,以避免異意)

2. 創(chuàng)建Plugin

本著“有圖有真相”的原則,下面將連續(xù)多圖并配文字一步步創(chuàng)建、調(diào)試Plugin。圖中畫紅圈的代表需要填寫或者需要選擇的地方。

創(chuàng)建項(xiàng)目

新建項(xiàng)目 alt text

 

Name項(xiàng)一定要以np開(kāi)頭,為了將來(lái)適應(yīng)不同操作系統(tǒng),最好全小寫,不要太長(zhǎng),盡量控制在8字符內(nèi)。
本例定義為npdemo
Location項(xiàng)定義到plugin\sdk\samples以便項(xiàng)目屬性中用相對(duì)路徑引用NPAPI的SDK
本例定義為d:\code\plugin\sdk\samples
alt text

 

向?qū)?br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-color: initial; " />alt text

 

選擇Application typeDLL
選擇Empty project
alt text

 

添加文件

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

 

一共3個(gè)文件
alt text

 

然后,添加def文件
alt text

 

命名最好與項(xiàng)目一致
alt text

 

編輯npdemo.def為

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

 

現(xiàn)在,添加資源
alt text

 

選擇Version
alt text

 

自動(dòng)生成了resource.hnpdemo.rc。由于要在版本信息中加項(xiàng),所以手工npdemo.rc
alt text

 

選擇“Y”
alt text

 

在圖中的BLOCK中添加。注意!BLOCK 一定要是"040904e4
VALUE "MIMEType", "application/demo-plugin"
這里順便說(shuō)一下,MIMEType是plugin的唯一標(biāo)示,需要自己定義
通常的格式是"application/“+ [plugin name]
本例中定義為"application/demo-plugin"
alt text

 

下面添加最關(guān)鍵的部分:Plugin實(shí)現(xiàn)類
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
其中實(shí)現(xiàn)了4個(gè)全局函數(shù)

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

修改項(xiàng)目屬性

 

打開(kāi)項(xiàng)目屬性 alt text

 

修改字符集設(shè)置為“Use Multi-Byte Character Set
alt text

 

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

 

添加預(yù)編譯宏 X86
alt text

編譯調(diào)試

現(xiàn)在可以編譯了!
本例編譯后,在D:\code\plugin\sdk\samples\npdemo\Debug生成npdemo.dll

打開(kāi)注冊(cè)表,在HKEYLOCALMACHINE\SOFTWARE\MozillaPlugins下新建子項(xiàng)@mozilla.com.cn/demo
并新建字符串?dāng)?shù)據(jù)“Path”設(shè)值為D:\code\plugin\sdk\samples\npdemo\Debug\npdemo.dll

alt text

 

打開(kāi)火狐瀏覽器 在地址欄輸入“about:plugins” 如果在plugin列表中有本例的npdemo.dll及說(shuō)明我們的plugin示例已經(jīng)成功完成
alt text