1. 程式人生 > >NPAPI開發詳解,Windows版

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。圖中畫紅圈的代表需要填寫或者需要選擇的地方。

建立專案

新建專案 alt text

Name項一定要以np開頭,為了將來適應不同作業系統,最好全小寫,不要太長,儘量控制在8字元內。
本例定義為npdemo
Location項定義到plugin\sdk\samples以便專案屬性中用相對路徑引用NPAPI的SDK
本例定義為d:\code\plugin\sdk\samples
alt text

嚮導
alt text

選擇Application type

DLL
選擇Empty project
alt text

新增檔案

首先,新增NPAPI SDK中的Common檔案
alt text

一共3個檔案
alt text

然後,新增def檔案
alt text

命名最好與專案一致
alt text

編輯npdemo.def為

LIBRARY "npdemo"

EXPORTS
    NP_GetEntryPoints   @1
    NP_Initialize       @2
    NP_Shutdown         @3

現在,新增資源
alt text

選擇Version
alt text

自動生成了resource.hnpdemo.rc。由於要在版本資訊中加項,所以手工npdemo.rc


alt text

選擇“Y”
alt text

在圖中的BLOCK中新增。注意!BLOCK 一定要是"040904e4
VALUE "MIMEType", "application/demo-plugin"
這裡順便說一下,MIMEType是plugin的唯一標示,需要自己定義
通常的格式是"application/“+ [plugin name]
本例中定義為"application/demo-plugin"
alt text

下面新增最關鍵的部分:Plugin實現類
alt text
alt text

類名可以隨便起,本例命名為CPlugin
但是一定要繼承自nsPluginInstanceBace
alt text

修改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()
{
}


修改專案屬性

開啟專案屬性 alt text

修改字符集設定為“Use Multi-Byte Character Set
alt text

新增搜尋目錄 “....\include”和“........\base\public
alt text

新增預編譯巨集 X86
alt text

編譯除錯

現在可以編譯了!
本例編譯後,在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

alt text

開啟火狐瀏覽器 在位址列輸入“about:plugins” 如果在plugin列表中有本例的npdemo.dll及說明我們的plugin示例已經成功完成
alt text

簡單的測試頁面: 

<HTML>
    <HEAD>
    </HEAD>
    <BODY>
        <embed type="application/demo-plugin">
    </BODY>
</HTML>