NPAPI開發詳解,Windows版
本文通過多圖組合,詳細引導初學者開發NPAPI的瀏覽器外掛。
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。圖中畫紅圈的代表需要填寫或者需要選擇的地方。
建立專案
新建專案
Name項一定要以np開頭,為了將來適應不同作業系統,最好全小寫,不要太長,儘量控制在8字元內。
本例定義為npdemo
Location項定義到plugin\sdk\samples以便專案屬性中用相對路徑引用NPAPI的SDK
本例定義為d:\code\plugin\sdk\samples
嚮導
選擇Application type
為DLL
選擇Empty project
新增檔案
首先,新增NPAPI SDK中的Common檔案
一共3個檔案
然後,新增def檔案
命名最好與專案一致
編輯npdemo.def為
LIBRARY "npdemo" EXPORTS NP_GetEntryPoints @1 NP_Initialize @2 NP_Shutdown @3
現在,新增資源
選擇Version
自動生成了resource.h和npdemo.rc。由於要在版本資訊中加項,所以手工npdemo.rc
選擇“Y”
在圖中的BLOCK中新增。注意!BLOCK 一定要是"040904e4"
VALUE "MIMEType", "application/demo-plugin"
這裡順便說一下,MIMEType是plugin的唯一標示,需要自己定義
通常的格式是"application/“+ [plugin name]
本例中定義為"application/demo-plugin"
下面新增最關鍵的部分:Plugin實現類
類名可以隨便起,本例命名為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
其中實現了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() { }
修改專案屬性
開啟專案屬性
修改字符集設定為“Use Multi-Byte Character Set”
新增搜尋目錄 “....\include”和“........\base\public”
新增預編譯巨集 X86
編譯除錯
現在可以編譯了!
本例編譯後,在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
開啟火狐瀏覽器 在位址列輸入“about:plugins” 如果在plugin列表中有本例的npdemo.dll及說明我們的plugin示例已經成功完成
簡單的測試頁面:
<HTML>
<HEAD>
</HEAD>
<BODY>
<embed type="application/demo-plugin">
</BODY>
</HTML>