使用NPAPI編寫跨平台(Windows/Linux/Mac)跨瀏覽器(Chrome/Firefox/Safari)的插件


  最近項目中需要我編寫跨平台的瀏覽器控件供JavaScript調用,經過幾天折騰,我的插件已經能夠很好的工作在Windows、Linux、Mac平台上的主流瀏覽器上,和JavaScript也可以很好的進行交互通知,下面就介紹一下主要的NPAPI插件開發流程和一些需要特別注意的地方。

  1. 下載NPAPI-SDK,里面有4個文件npapi.h、npfunctions.h、npruntime.h、nptypes.h,我們不需要改動它們。
  2. 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進行通信的時候我們會使用到。
  3. 修改NPP_GetMIMEDescription,Linux版的插件必須實現該函數,返回值必須為指定的格式:
    NP_GetMIMEDescription()
    {
      return "application/basic-plugin:bsc:Basic plugin";
    }
    application/basic-plugin便是該插件的MIME TYPE了,每個NPAPI插件必須定義自己的的MIME TYPE,這樣JavaScript就可以通過MIME TYPE加載插件了,Windows版的插件MIME TYPE是通過.rc資源文件里定義的"MIMEType"字段返回的,Mac版的插件則是通過Info.plist里的WebPluginMIMETypes字段返回的,具體可以參見NPAPI-SDK里的samples里面的例子。
  4. 我們需要在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
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM