1. 準(zhǔn)備工作
開(kāi)發(fā)工具
本例使用的是visual studio 2008 英文版,下圖是關(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)目
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
向?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; " />
選擇Application type為DLL
選擇Empty project
添加文件
首先,添加NPAPI SDK中的Common文件
一共3個(gè)文件
然后,添加def文件
命名最好與項(xiàng)目一致
編輯npdemo.def為
LIBRARY "npdemo" EXPORTS NP_GetEntryPoints @1 NP_Initialize @2 NP_Shutdown @3
現(xiàn)在,添加資源
選擇Version
自動(dòng)生成了resource.h和npdemo.rc。由于要在版本信息中加項(xiàng),所以手工npdemo.rc
選擇“Y”
在圖中的BLOCK中添加。注意!BLOCK 一定要是"040904e4"
VALUE "MIMEType", "application/demo-plugin"
這里順便說(shuō)一下,MIMEType是plugin的唯一標(biāo)示,需要自己定義
通常的格式是"application/“+ [plugin name]
本例中定義為"application/demo-plugin"
下面添加最關(guān)鍵的部分:Plugin實(shí)現(xiàn)類
類名可以隨便起,本例命名為CPlugin
但是一定要繼承自nsPluginInstanceBace
修改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)目屬性
修改字符集設(shè)置為“Use Multi-Byte Character Set”
添加搜索目錄 “....\include”和“........\base\public”
添加預(yù)編譯宏 X86
編譯調(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
打開(kāi)火狐瀏覽器 在地址欄輸入“about:plugins” 如果在plugin列表中有本例的npdemo.dll及說(shuō)明我們的plugin示例已經(jīng)成功完成
![]()