NPAPI开发详解,Windows版
原文:http://mozilla.com.cn/post/21666/
本文通過多圖組合,詳細引導初學者開發NPAPI的瀏覽器插件。
如需測試開發完成的插件請參考http://mozilla.com.cn/kb/dev/A.88/
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.rar的下載。
本例將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為
| 1 2 3 4 5 6 | 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"??
下圖是rc文件數據項與plugin數據項(about:plugins?中)的對應關系???
下面添加最關鍵的部分:Plugin實現類????
類名可以隨便起,本例命名為CPlugin??但是一定要繼承自nsPluginInstanceBace??
修改Plugin.h
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #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;??returnTRUE;} ??void?shut()? {? m_bInitialized = FALSE;? } ??NPBool isInitialized()? {??return?m_bInitialized;? } }; |
修改Plugin.cpp
??其中實現了4個全局函數
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #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
??
現在可以編譯了!
3、注冊、測試
本例編譯后,在D:\code\plugin\sdk\samples\npdemo\Debug生成npdemo.dll
打開注冊表,在HKEY_CURRENT_USER\SOFTWARE\MozillaPlugins下新建子項@mozilla.com.cn/demo
??并新建字符串數據“Path”設值為D:\code\plugin\sdk\samples\npdemo\Debug\npdemo.dll
打開火狐瀏覽器??在地址欄輸入“about:plugins”??如果在plugin列表中有本例的npdemo.dll及說明我們的plugin示例已經成功完成
???
簡單的測試頁面:
| 1 2 3 4 5 6 7 | <HTML> ????<HEAD> ????</HEAD> ????<BODY> ????????<embed?type="application/demo-plugin"> ????</BODY> </HTML> |
特別注意
如果在實際部署中使用安裝文件安裝plugin,并用注冊表的方式注冊。那么就不需要重啟火狐,只要在頁面中執行?navigator.plugins.refresh(false);??????然后刷新頁面即可使用剛安裝的plugin
25條評論?? 2011-07-11 10:57
總結
以上是生活随笔為你收集整理的NPAPI开发详解,Windows版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何制作cab包(解决不能注册的问题)
- 下一篇: 在Win7 64位注册ActiveX控件