青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我的玻璃盒子

【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)——為插件添加和腳本交互的能力

先說一句題外話,上一節(jié)一開始我提到了由于.rc導(dǎo)致我自己寫的插件不能被FF識(shí)別的問題,今天終于找到答案了。在這篇文章中:https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Plug-in_Development_Overview,有這么一段話:In your development environment, make sure your language is set to "US English" and the character set to "Windows Multilingual." The resource code for this language and character set combination is 040904E4. 看來這FF還只能使用英文。

OK,步入正題。這一小節(jié)我來簡(jiǎn)單說一下如何為插件添加和腳本語言(如Javascript)交互的能力。我會(huì)為插件添加幾個(gè)函數(shù),供Javascript調(diào)用。

前面我們提到過瀏覽器調(diào)用插件的方法的順序,基本上為:NP_GetEntryPoints、NP_Initialize、NPP_New、NPP_SetWindow、NPP_GetValue。在NPP_New中,我們需要?jiǎng)?chuàng)建插件對(duì)象的實(shí)例,NPP_SetWindow中,瀏覽器會(huì)傳入插件窗口的信息,最后一個(gè)NPP_GetValue,是瀏覽器來獲取一些插件信息的。NPP_GetValue函數(shù)的結(jié)構(gòu)是這樣的:

NPError  NPP_GetValue(NPP instance, NPPVariable variable, void *value);

  • instance包含著插件對(duì)象實(shí)例;
  • variable表示瀏覽器要獲取的信息的類型;
  • value表示返回給瀏覽器的值

瀏覽器會(huì)傳入NPPVpluginScriptableNPObject(作為variable參數(shù))來查詢插件是否支持Scriptable功能(即和腳本語言交互的功能),在這里,我們可以利用NPN_CreateObject方法來創(chuàng)建一個(gè)NPObject對(duì)象,并且作為value返回給瀏覽器。這樣,瀏覽器就通過這個(gè)NPObject對(duì)象和我們的插件建立了連接。當(dāng)頁面上Javascript調(diào)用了我們插件對(duì)象的某個(gè)方法時(shí),瀏覽器會(huì)調(diào)用該NPObject對(duì)象的HasMethod方法來查詢是否支持這個(gè)方法,如果支持,則會(huì)調(diào)用NPObject對(duì)象的Invoke方法,傳入方法名、參數(shù)等信息。這樣,我們就可以讓網(wǎng)頁上的腳本語言來執(zhí)行我們編寫的函數(shù)了。在Windows上,我們編寫的函數(shù)就如同編寫普通的應(yīng)用程序一樣,可以使用很多Windows API來完成許多復(fù)雜的工作。

上面有個(gè)問題:如何創(chuàng)建我們自己的NPObject對(duì)象?NPN_CreateObject方法如何使用?好在Mozilla給我們提供了npruntime這個(gè)例子程序,可以讓我們得以參考。

先來看看NPN_CreateObject方法的定義:

NPObject *NPN_CreateObject(NPP npp, NPClass *aClass);

關(guān)鍵在第二個(gè)參數(shù)上,我們需要提供一個(gè)NPClass指針。npruntime例子程序中是這么做的:

定義了一個(gè)宏DECLARE_NPOBJECT_CLASS_WITH_BASE,其作用就是定義了一個(gè)靜態(tài)的NPClass對(duì)象,并且NPClass要求的所有基礎(chǔ)方法,都由一個(gè)ScriptablePluginObjectBase類來提供。我們根據(jù)需要,來創(chuàng)建不同的繼承于ScriptablePluginObjectBase的類(比如支持方法的類和支持屬性的類),傳給DECLARE_NPOBJECT_CLASS_WITH_BASE宏,這樣,當(dāng)瀏覽器管我們“要”的時(shí)候,我們就可以按照它的需要“給”它對(duì)應(yīng)的對(duì)象。

npruntime例子中,ScriptablePluginObject是用來處理方法的,而ConstructablePluginObject是用來處理屬性的。

 

如何定義一個(gè)方法(或?qū)傩裕?/strong>

1、添加一個(gè)方法(或?qū)傩裕┖芎?jiǎn)單,先定義一個(gè)靜態(tài)NPIdentifier類型的變量,例如:

static NPIdentifier s_idSetArgs;

2、在插件對(duì)象構(gòu)造函數(shù)中,使用NPN_GetStringIdentifier方法來設(shè)置該方法的名稱,例如:

s_idSetArgs = NPN_GetStringIdentifier("SetArgs");

其中,SetArgs就是我們提供給腳本語言調(diào)用的方法名稱。

3、在ScriptablePluginObject的HasMethod方法中,判斷傳入的方法名:

bool ScriptablePluginObject::HasMethod(NPIdentifier name)
{
    if(name == s_idSetArgs)
    {
        printf("method name = SetArgs\n");
        return true;
    }

    return false;
}

4、在ScriptablePluginObject的Invoke方法中,判斷如果傳入的方法名稱等于我們定義的方法名,則做你想要做得事情:

//////////////////////////////////////////////////////////////////////////
///
/// @brief    如果某個(gè)方法支持(使用HasMethod檢測(cè)),當(dāng)頁面上Javascript代碼調(diào)用該方法時(shí),會(huì)執(zhí)行本函數(shù)
///
/// @param [in] name    方法名
/// @param [in] args    參數(shù)值(數(shù)組)
/// @param [in] argCount    參數(shù)個(gè)數(shù)
/// @param [in] result    執(zhí)行后返回給調(diào)用者的結(jié)果
///
/// @return PR_TRUE表示執(zhí)行成功,PR_FALSE表示失敗
///
//////////////////////////////////////////////////////////////////////////

bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant *result)

{
    if(name == s_idSetArgs)

    {

        這里做你想要做得事情

        return PR_TRUE;

    }

    return PR_FALSE;

}

關(guān)于方法參數(shù)的接收,這里舉個(gè)例子。比如網(wǎng)頁上這么調(diào)用:

embedobj.SetArgs("name", "value");

在我們的方法中,就可以這么接收:

if(args != NULL && argCount >= 2)
{
    NPVariant npvName = args[0]; //第一個(gè)參數(shù)
    NPVariant npvValue = args[1]; //第二個(gè)參數(shù)
    if(NPVARIANT_IS_STRING(npvName) && NPVARIANT_IS_STRING(npvValue))  //如果兩者都是字符串類型(當(dāng)然你還可以判斷是否是其他類型)
    {
        NPString npsName = NPVARIANT_TO_STRING(npvName); //轉(zhuǎn)成NPString
        NPString npsValue = NPVARIANT_TO_STRING(npvValue);

        if(npsName.utf8characters && strlen(npsName.utf8characters) > 0) //限定條件,可以根據(jù)需要進(jìn)行修改。這里限定第一個(gè)參數(shù)內(nèi)容不能為空
        {
            int nLenName = strlen(npsName.utf8characters) + 1;
            int nLenValue = strlen(npsValue.utf8characters) + 1;

            PARAMPAIR paramPair;
            paramPair.pName = new char[nLenName];
            memset(paramPair.pName, 0, nLenName);
            paramPair.pValue = new char[nLenValue];
            memset(paramPair.pValue, 0, nLenValue);

            strcpy(paramPair.pName, npsName.utf8characters); //將參數(shù)內(nèi)存存儲(chǔ)到我們熟悉的C
            strcpy(paramPair.pValue, npsValue.utf8characters);

            m_vecParamPair.push_back(paramPair);
        }
    }
}

上面的代碼中,PARAMPAIR就是一個(gè)簡(jiǎn)單的結(jié)構(gòu)體:

typedef struct tagPARAMPAIR
{
    LPTSTR pName;
    LPTSTR pValue;
}PARAMPAIR, *PPARAMPAIR;

m_vecParamPair是一個(gè)vector:vector<PARAMPAIR> m_vecParamPair;

順便說一句,上面只是代碼片段,關(guān)于內(nèi)存釋放、vector清空等操作,由于不是這里要說的關(guān)鍵部分,所以沒有列出。

OK,現(xiàn)在我們的插件已經(jīng)可以順利和網(wǎng)頁進(jìn)行交互工作了。

posted on 2008-11-14 10:56 深藍(lán)色系統(tǒng) 閱讀(16710) 評(píng)論(10)  編輯 收藏 引用 所屬分類: Firefox開發(fā)

評(píng)論

# re: 我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力 2009-07-29 13:37 tmy13

學(xué)習(xí)了下npapi再回過頭來看樓主的這篇文章,受益匪淺  回復(fù)  更多評(píng)論   

# re: 【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力 2009-10-19 15:43 tt

我是一個(gè)新手,能不能做一個(gè) hello word 的例子?  回復(fù)  更多評(píng)論   

# re: 【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力 2009-11-11 11:28 Pat

太好了。高手。我看這代碼都看不明白,現(xiàn)在懂個(gè)大概了,非常感謝!  回復(fù)  更多評(píng)論   

# re: 【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力 2009-11-11 18:31 Pat

你好,我想知道怎么樣從plugin里面訪問JS,能留個(gè)聯(lián)系方式嗎?QQ  回復(fù)  更多評(píng)論   

# re: 【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力[未登錄] 2010-11-02 15:27 Eping

在資源文件里添加版本信息,保證 BLOCK "040904e4" 即可,是否為英語倒不是這么重要,查看Firefox源代碼可發(fā)現(xiàn),這才是最重要的!
if(::GetFileVersionInfo((char*)path, NULL, versionsize, verbuf))
{
info.fName = GetKeyValue(verbuf, "\\StringFileInfo\\040904E4\\ProductName");
info.fDescription = GetKeyValue(verbuf, "\\StringFileInfo\\040904E4\\FileDescription");

char *mimeType = GetKeyValue(verbuf, "\\StringFileInfo\\040904E4\\MIMEType");
char *mimeDescription = GetKeyValue(verbuf, "\\StringFileInfo\\040904E4\\FileOpenName");
char *extensions = GetKeyValue(verbuf, "\\StringFileInfo\\040904E4\\FileExtents");

BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904e4"
BEGIN
VALUE "Comments", "\0"
VALUE "CompanyName", " \0"
VALUE "FileDescription", "Adobe Flash movie \0"
VALUE "FileExtents", "swf\0"  回復(fù)  更多評(píng)論   

# re: 【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力 2011-08-26 15:14 求穩(wěn)

你好,我想請(qǐng)問下, 能通過firefox extension 來 調(diào)用 NPAPI dll寫的方法嗎? 如果可以,該通過什么方式呢? xul 里 還是 js 里呢?  回復(fù)  更多評(píng)論   

# re: 【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力 2012-07-06 18:10 陳后根

可以這里沒有講如何用插件調(diào)用js中的函數(shù),應(yīng)該怎樣實(shí)現(xiàn)這個(gè)功能呢?
  回復(fù)  更多評(píng)論   

# re: 【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力 2013-09-13 14:57 maqingfeng

你好,我想問一下,如何把接收到的參數(shù),傳遞給插件對(duì)象呢?就是在pluging.cpp中有一個(gè)回調(diào)函數(shù),在這上面畫出傳進(jìn)來的字符串。而這個(gè)函數(shù)不是plugin的成員函數(shù)。  回復(fù)  更多評(píng)論   

# re: 【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力[未登錄] 2013-09-18 10:11 sun

大神,我想做firefox plugin 加密,能不能給個(gè)demo看看【15527974275@163.com】,我都不知道
bool ScriptablePluginObject::HasMethod(NPIdentifier name) ,這個(gè)方法放在哪里? 我以前是搞object_c的,,這個(gè)完全不懂,研究半個(gè)月,卡在這個(gè)地方了,seek help!  回復(fù)  更多評(píng)論   

# re: 【原創(chuàng)】我的Firefox插件開發(fā)之旅(7)&mdash;&mdash;為插件添加和腳本交互的能力 2016-03-05 01:26 zzx

報(bào)錯(cuò):無法解析外部符號(hào)_NPN_CreateObject,很納悶啊!  回復(fù)  更多評(píng)論   

導(dǎo)航

<2013年3月>
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456

統(tǒng)計(jì)

  • 隨筆 - 49
  • 文章 - 9
  • 評(píng)論 - 588
  • 引用 - 0

常用鏈接

留言簿(75)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              欧美成人午夜激情视频| 亚洲精品四区| 99re热这里只有精品视频| 国产一区二区剧情av在线| 妖精成人www高清在线观看| 在线观看亚洲精品视频| 欧美一级电影久久| 亚洲一级在线观看| 欧美精品在线观看| 欧美激情一区在线| 国内外成人免费激情在线视频网站 | 亚洲在线视频观看| 一本色道久久综合精品竹菊 | 欧美一区中文字幕| 西西人体一区二区| 国产精品地址| 亚洲精品一区中文| 亚洲美女视频在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 久久久夜色精品亚洲| 国产农村妇女毛片精品久久莱园子| 99精品欧美一区| 一本色道久久精品| 欧美日韩高清一区| 一级日韩一区在线观看| 亚洲视频图片小说| 国产精品国产三级国产aⅴ9色| 亚洲免费av片| 亚洲在线观看免费| 国产女主播一区| 欧美亚洲免费电影| 久久一区欧美| 91久久精品国产91久久性色tv| 久久色中文字幕| 欧美国产综合视频| 一本色道**综合亚洲精品蜜桃冫| 欧美欧美在线| 一区二区高清视频在线观看| 午夜精品久久| 国产视频久久| 老司机成人在线视频| 亚洲精品系列| 亚洲欧美日韩一区| 国产曰批免费观看久久久| 久久久久网址| 亚洲精品一区二区三区av| 亚洲一区二区在| 国产性天天综合网| 免费高清在线一区| 夜夜嗨一区二区三区| 欧美在线视频观看| 亚洲国产精品悠悠久久琪琪| 欧美精品一区在线发布| 亚洲免费综合| 欧美国产视频在线| 亚洲欧美日韩天堂一区二区| 狠狠色丁香久久婷婷综合_中| 免费观看亚洲视频大全| 亚洲视频网在线直播| 麻豆成人在线| 亚洲一区二区三区成人在线视频精品| 国产情侣一区| 欧美精品日日鲁夜夜添| 欧美亚洲一区二区三区| 亚洲激情在线观看| 欧美在线地址| 夜夜嗨av一区二区三区| 国产亚洲欧洲一区高清在线观看| 欧美成人免费全部观看天天性色| 亚洲亚洲精品在线观看 | 久久精品亚洲一区二区| 亚洲精品资源| 国产综合精品| 国产精品老女人精品视频| 欧美不卡三区| 欧美在线观看网址综合| 99视频有精品| 91久久久精品| 美女主播一区| 久久成人精品无人区| 日韩一级黄色片| 在线欧美视频| 国产综合亚洲精品一区二| 欧美色精品在线视频| 免费成人激情视频| 久久精品国产亚洲高清剧情介绍| 在线亚洲自拍| 亚洲精品在线观看免费| 欧美国产日韩xxxxx| 久久综合伊人77777麻豆| 午夜在线电影亚洲一区| 一区二区三区**美女毛片| 亚洲人体大胆视频| 亚洲第一综合天堂另类专| 国产自产v一区二区三区c| 国产老女人精品毛片久久| 国产精品第一区| 欧美视频免费在线| 欧美日韩国产页| 欧美区在线播放| 欧美国产日产韩国视频| 免费精品99久久国产综合精品| 久久精品在线观看| 欧美伊人久久久久久午夜久久久久| 亚洲在线中文字幕| 一区二区av在线| 一区二区三区毛片| 正在播放亚洲一区| 亚洲性视频h| 亚洲综合精品一区二区| 亚洲一区二区三区涩| 亚洲欧美日本国产有色| 亚洲免费在线观看视频| 午夜日韩av| 久久精品日韩欧美| 久久综合给合久久狠狠狠97色69| 狂野欧美激情性xxxx| 久久午夜视频| 欧美精品久久久久久久久老牛影院| 欧美大片一区| 欧美日本久久| 国产精品久久久久av| 国产麻豆91精品| 精品1区2区| 亚洲人线精品午夜| 这里是久久伊人| 午夜亚洲视频| 女人色偷偷aa久久天堂| 亚洲第一视频网站| 一本色道久久综合狠狠躁篇的优点| 亚洲午夜久久久| 欧美在线观看视频| 欧美岛国在线观看| 国产精品久久久久久久久免费桃花 | 欧美日韩一区在线观看视频| 国产精品毛片高清在线完整版 | 欧美视频中文字幕| 国产日韩欧美二区| 在线观看成人一级片| 夜夜爽av福利精品导航| 欧美一区二区精品久久911| 老司机免费视频久久| 亚洲精品欧美在线| 午夜精品久久久久久久99水蜜桃 | 久久精品系列| 欧美精品国产| 国产日韩欧美夫妻视频在线观看| 亚洲国产国产亚洲一二三| 亚洲视频在线播放| 美女视频黄a大片欧美| 亚洲精品在线观看免费| 欧美在线综合视频| 欧美日韩免费高清| 影音先锋中文字幕一区二区| 亚洲一区二区三区在线看| 久久久天天操| 99re视频这里只有精品| 久久久久99精品国产片| 国产精品久久久久久久久免费樱桃| 伊人婷婷欧美激情| 亚洲女爱视频在线| 欧美顶级艳妇交换群宴| 亚洲欧美激情一区二区| 欧美精品在线观看播放| 狠狠88综合久久久久综合网| 亚洲一级片在线观看| 欧美国产日韩在线| 久久av老司机精品网站导航| 欧美午夜在线| 亚洲精品国产系列| 免费精品视频| 性欧美大战久久久久久久免费观看 | 亚洲一区二区av电影| 欧美大片va欧美在线播放| 欧美一区免费视频| 国产精品美女午夜av| 99精品久久久| 亚洲第一精品夜夜躁人人爽| 久久久久一区二区三区| 国产色爱av资源综合区| 香蕉久久夜色精品国产| 中国成人在线视频| 欧美片在线播放| 亚洲三级观看| 亚洲国产成人精品视频| 久久综合久久88| 亚洲大胆人体视频| 久久这里有精品15一区二区三区| 性做久久久久久久免费看| 国产精品一区亚洲| 欧美一区免费视频| 午夜精品久久久久久久99水蜜桃 | 欧美日韩一区二区在线视频| 亚洲精品三级| 91久久中文字幕| 欧美另类视频在线| 亚洲亚洲精品在线观看| 日韩亚洲国产欧美| 欧美午夜精品一区二区三区| 亚洲欧美www|