NPAPI外掛程式開發

2021-06-27 12:57:10 字數 3245 閱讀 2151

目錄(?)

[+]

要實現這樣乙個功能,最簡單的方式是寫js來實現,只需要首先用getelementbyid獲取外掛程式,然後設定其width屬性和height屬性。但是,通常情況下我們只管編寫外掛程式,不負責網頁的設計,如果我們設計完乙個外掛程式,還要為網頁設計人員寫一大堆的注意事項,是不是可以說我們的外掛程式寫得不太高明呢?

為了能夠在外掛程式中更改外掛程式視窗的尺寸。我們需要使用的介面其實很少,為了方便,我們為plugin類新增乙個成員函式changsize(int width, int height):函式**如下:

void plugin::changesize(int width,int height)  

**很簡單,不多說了,唯一有難點的是npnvpluginelementnpobject,因為在mdn上沒有對npn_getvalue(m_pnpinstance,npnvpluginelementnpobject,&pluginobj);得到的npobject做任何說明,可能老外都認為npnvpluginelementnpobject這個詞就能夠完全說明問題吧!

得到了npobject,然後就為它設定屬性,只需要乙個函式npn_setproperty和乙個巨集int32_to_npvariant或者stringz_to_npvariant就可以完成屬性的設定,這樣一來,就改變了外掛程式視窗的尺寸了。

這種方式與js方式的實質是一樣的,只不過將**在外掛程式中進行了實現,而且不需要借助外掛程式中呼叫js**。

該功能不複雜,不過使用了windows提供的api故只適用於windows平台。**如下:

lptstr modulename = new tchar[100];  

getmodulefilename(getmodulehandle(_t("name")),modulename,100);  

std::string mpath = std::string(modulename);  

getmodulehandle(_t("name"))的name即你的外掛程式名稱,如:npdemo.dll。tchar的長度視具體情況而定,用於儲存得到的路徑。注意需要include tchar.h和string(是string不是string.h)。當然路徑其實已經儲存在modulename中了,如果不用string可以不要最後一句(鑑於字串處理的繁瑣,推薦使用string)。

要獲取外掛程式頁面的路徑,可以參考:其中提到了三種方式,但我感覺比較靠譜的方式是第一種,下面是簡單的實現**:

npobject *pluginobj;  

npn_getvalue(m_pnpinstance,npnvwindownpobject,&pluginobj);  

npidentifier  n=npn_getstringidentifier("location");  

npvariant rval;  

npn_getproperty(m_pnpinstance,pluginobj,n,&rval);  

npobject* locationobj = rval.value.objectvalue;  

n=npn_getstringidentifier("href");  

npn_getproperty(m_pnpinstance,locationobj,n,&rval);  

std::string  pageurl = std::string(rval.value.stringvalue.utf8characters);  

object標籤可以使用data屬性設定資源的url,embed標籤使用src屬性設定資源url。獲取資源路徑的**如下:

npobject *pluginobj;  

npn_getvalue(m_pnpinstance,npnvpluginelementnpobject,&pluginobj);  

npidentifier n=npn_getstringidentifier("src");  

npvariant rval;  

npn_getproperty(m_pnpinstance, pluginobj, n, &rval);  

if(npvariant_is_string(rval))  

m_psrc = std::string(npvariant_to_string(rval).utf8characters);  

else  

這樣,不管html中使用的是object標籤的data還是使用的embed標籤中的src設定資源url,都可以將資源的完整url儲存到m_psrc中。

除了通用屬性如:id、class等,object標籤的屬性有type、data、width、height,embed標籤的屬性有type、src、width、height。而flashplayer外掛程式所具有的loop、autoplay等屬性都是外掛程式自己新增的,無法用npn_getproperty介面進行獲取。假設我們要開發乙個外掛程式允許使用loop屬性,那該怎麼實現呢?

這個就要找到ns_newplugininstance函式中了,這個函式的引數是乙個nsplugincreatedata。這個結構中就儲存了標籤中所有的屬性和屬性值。這個函式中建立了乙個新的plugin物件,plugin物件的構造函式引數為npp,故此處傳遞了nsplugincreatedata的instance。如果我們需要獲取和識別私有屬性如loop,推薦實現乙個可以接受nsplugincreatedata的plugin建構函式。這樣就可以在plugin建構函式中獲取私有屬性的值了。

假設我們要實現私有屬性loop。並使得只有如下方式loop才無效:不設定loop屬性、loop=false、loop=no、loop=0.其他方式loop如:loop、loop=true、loop=yes、loop=1等都有效。那我們的**可以這樣寫:

//讀取私有屬性。  

m_bloop=false;//初始設為false,保證沒有設定該屬性時無效  

int16_t argnum = cd->argc;//the number of html arguments in the element  

//  cd->argn;//the argn array contains the attribute names  

//  cd->argv;//the argv array contains the attribute values  

int16_t argcur = 0;  

for (argcur=0;argcurargn[argcur],"loop"))  

}  如上**所實現的私有屬性最簡單的組合就是需要loop時用不需要loop時用。其中name=value對表示其他屬性類似於:id=」plugindemo」。

npapi外掛程式學習

作為乙個菜鳥,我是怎麼認識npapi外掛程式的。1 什麼是外掛程式?故名思意,乙個大傢伙的小功能 瀏覽器上的某個功能 2 為什麼要用到外掛程式?在瀏覽器上面可以完成前端資料與後台資料的通訊。3 與這樣的外掛程式功能類似的還有其他的開發程式嗎?我也不知道。4 為什麼要用c 語言開發np外掛程式呢?優勢...

NPAPI外掛程式開發詳細記錄 外掛程式的除錯

這裡歸納一下我知道的在外掛程式開發中使用的幾種除錯手段。之前也提及過關於外掛程式的除錯,這裡需要補充一點關於在chrome中除錯外掛程式的內容,在chrome中執行外掛程式時,外掛程式的程序也是chrome.exe,因此要準確的找到正確的外掛程式程序可以為chrome新增啟動引數 plugin st...

NPAPI指令碼化介面

scriptable介面的實現,與屬性有關的函式為hasproperty getproperty setproperty。在js中設定屬性 以bar為例 用plugin.bar barvalue 來設定,獲取屬性直接用plugin.bar 如果要為外掛程式建立屬性,必須要在hasproperty中返...