最近項目中需要我編寫跨平台的瀏覽器控件供JavaScript調用,經過幾天折騰,我的插件已經能夠很好的工作在Windows、Linux、Mac平台上的主流瀏覽器上,和JavaScript也可以很好的進行交互通知,下面就介紹一下主要的NPAPI插件開發流程和一些需要特別注意的地方。
- 下載NPAPI-SDK,里面有4個文件npapi.h、npfunctions.h、npruntime.h、nptypes.h,我們不需要改動它們。
- 在http://mxr.mozilla.org/seamonkey/source/modules/plugin/samples/npruntime/下載np_entry.cpp、npn_gate.cpp、npp_gate.cpp,我們需要利用它們實現插件腳本化支持。np_entry.cpp和npn_gate.cpp我們不用修改,最主要的就是npp_gate.cpp里面的這3個函數:NPP_GetMIMEDescription、NPP_New和NPP_GetValue,對於Windows版本的插件重要的還有NPP_SetWindow,我們將使用作為參數傳進來的窗口句柄實現插件自己的消息循環,在和JavaScript進行通信的時候我們會使用到。
- 修改NPP_GetMIMEDescription,Linux版的插件必須實現該函數,返回值必須為指定的格式:
NP_GetMIMEDescription() { return "application/basic-plugin:bsc:Basic plugin"; }
- 我們需要在NPP_New里創建我們的插件實例,並使用instance->pdata保存,以便在其他NPP_*函數里可以使用我們的插件實例。另外Mac平台下需要設置NPPVpluginEventModel使用NPEventModelCocoa,否則Chrome瀏覽器無法正常加載插件。
NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char* argn[], char* argv[], NPSavedData* saved) { if(instance->pdata == NULL) instance->pdata = new CPlugin(); #ifdef XP_MACOSX NPN_SetValue(instance, NPPVpluginEventModel, (void *)NPEventModelCocoa); #endif }