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

我的玻璃盒子

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

先說一句題外話,上一節(jié)一開始我提到了由于.rc導致我自己寫的插件不能被FF識別的問題,今天終于找到答案了。在這篇文章中: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é)我來簡單說一下如何為插件添加和腳本語言(如Javascript)交互的能力。我會為插件添加幾個函數(shù),供Javascript調用。

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

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

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

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

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

先來看看NPN_CreateObject方法的定義:

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

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

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

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

 

如何定義一個方法(或屬性)?

1、添加一個方法(或屬性)很簡單,先定義一個靜態(tài)NPIdentifier類型的變量,例如:

static NPIdentifier s_idSetArgs;

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

s_idSetArgs = NPN_GetStringIdentifier("SetArgs");

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

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    如果某個方法支持(使用HasMethod檢測),當頁面上Javascript代碼調用該方法時,會執(zhí)行本函數(shù)
///
/// @param [in] name    方法名
/// @param [in] args    參數(shù)值(數(shù)組)
/// @param [in] argCount    參數(shù)個數(shù)
/// @param [in] result    執(zhí)行后返回給調用者的結果
///
/// @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;

}

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

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

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

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

        if(npsName.utf8characters && strlen(npsName.utf8characters) > 0) //限定條件,可以根據(jù)需要進行修改。這里限定第一個參數(shù)內容不能為空
        {
            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ù)內存存儲到我們熟悉的C
            strcpy(paramPair.pValue, npsValue.utf8characters);

            m_vecParamPair.push_back(paramPair);
        }
    }
}

上面的代碼中,PARAMPAIR就是一個簡單的結構體:

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

m_vecParamPair是一個vector:vector<PARAMPAIR> m_vecParamPair;

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

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

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

評論

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

學習了下npapi再回過頭來看樓主的這篇文章,受益匪淺  回復  更多評論   

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

我是一個新手,能不能做一個 hello word 的例子?  回復  更多評論   

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

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

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

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

# 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"  回復  更多評論   

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

你好,我想請問下, 能通過firefox extension 來 調用 NPAPI dll寫的方法嗎? 如果可以,該通過什么方式呢? xul 里 還是 js 里呢?  回復  更多評論   

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

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

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

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

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

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

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

報錯:無法解析外部符號_NPN_CreateObject,很納悶啊!  回復  更多評論   

導航

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

統(tǒng)計

常用鏈接

留言簿(75)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国内一区二区三区在线视频| 亚洲国产成人精品女人久久久| 亚洲人成在线观看| 老司机亚洲精品| 久久精品国产一区二区三区| 国产一区视频在线观看免费| 久久综合伊人| 老司机免费视频一区二区| 亚洲丰满少妇videoshd| 亚洲国语精品自产拍在线观看| 欧美不卡激情三级在线观看| 一本久道久久久| 亚洲一区二区精品视频| 国产主播一区二区| 亚洲大胆在线| 国产精品xnxxcom| 久久夜色精品国产亚洲aⅴ| 美女日韩欧美| 亚洲一区二区三区视频播放| 亚洲一区美女视频在线观看免费| 国产日韩欧美亚洲一区| 欧美激情亚洲视频| 国产精品久久久久aaaa九色| 久久午夜精品| 欧美日韩蜜桃| 美女91精品| 国产精品国产亚洲精品看不卡15| 久久久综合精品| 欧美日韩影院| 欧美成人性生活| 国产精品视区| 亚洲国产精品精华液网站| 国产精品女人网站| 亚洲国产欧美另类丝袜| 国产日韩欧美精品| 亚洲精品一二| 亚洲国产精品悠悠久久琪琪| 亚洲私人影院在线观看| 亚洲精品国偷自产在线99热| 欧美一二三视频| 亚洲色在线视频| 欧美成人免费在线观看| 久久婷婷国产综合国色天香| 欧美日韩在线播放一区二区| 欧美韩国日本综合| 国产偷国产偷精品高清尤物| av成人免费观看| 亚洲精品国产精品国产自| 午夜精品在线| 亚洲欧美日韩精品一区二区| 欧美国产日韩二区| 欧美成人国产| 狠狠狠色丁香婷婷综合激情| 亚洲女同同性videoxma| 亚洲午夜av| 欧美日韩精品一区二区在线播放| 欧美福利电影在线观看| 一区二区三区我不卡| 午夜伦理片一区| 欧美亚洲日本网站| 国产精品成人一区二区三区吃奶| 亚洲精品国偷自产在线99热| 91久久国产综合久久91精品网站| 欧美有码视频| 久久久噜噜噜久久狠狠50岁| 国产女人精品视频| 香蕉久久精品日日躁夜夜躁| 久久精品国产2020观看福利| 国产精品视区| 午夜亚洲影视| 久久婷婷色综合| 精品51国产黑色丝袜高跟鞋| 久久精品亚洲一区二区三区浴池| 久久中文在线| 亚洲高清自拍| 欧美久久九九| 一区二区三区成人| 午夜伦理片一区| 国产日韩精品久久| 久久久青草婷婷精品综合日韩| 浪潮色综合久久天堂| 亚洲韩国青草视频| 欧美日韩国产综合一区二区| 国产精品99久久久久久www| 午夜精品福利一区二区三区av| 国产日韩欧美成人| 老司机久久99久久精品播放免费| 亚洲二区在线| 亚洲欧美激情视频| 国产亚洲日本欧美韩国| 久久亚洲精品中文字幕冲田杏梨 | 欧美电影专区| 亚洲精品日日夜夜| 亚洲在线观看| 狠狠综合久久| 欧美日本不卡高清| 午夜精品久久久久久久99水蜜桃 | 亚洲国产日韩欧美一区二区三区| 欧美高清视频一二三区| 亚洲色图制服丝袜| 久久一二三四| 亚洲小说欧美另类婷婷| 国内精品亚洲| 欧美日韩一区二区在线| 欧美自拍丝袜亚洲| 亚洲精品在线观看免费| 久久国产精品久久精品国产| 亚洲精品日韩在线观看| 国产精品视频免费在线观看| 久久综合色影院| 宅男精品视频| 亚洲国产精品ⅴa在线观看| 午夜精品久久久99热福利| 在线成人www免费观看视频| 国产精品久久久久久模特| 蜜臀av一级做a爰片久久| 亚洲男人影院| 一本一本久久a久久精品综合妖精| 久久久久.com| 亚洲专区欧美专区| 亚洲日本视频| 含羞草久久爱69一区| 国产精品毛片在线| 欧美日本网站| 蜜桃av一区二区在线观看| 性色一区二区| 亚洲自拍16p| 日韩亚洲精品电影| 亚洲高清三级视频| 麻豆精品视频在线观看| 久久成人人人人精品欧| 亚洲伊人久久综合| 在线亚洲免费| 一区二区三区导航| 亚洲另类自拍| 亚洲人体影院| 亚洲毛片视频| 亚洲肉体裸体xxxx137| 1024成人| 亚洲第一页自拍| 狠狠久久亚洲欧美| 极品少妇一区二区三区精品视频 | 免费久久99精品国产自| 久久精品国产69国产精品亚洲| 亚洲午夜久久久久久尤物| 一本久久综合| 亚洲校园激情| 亚洲综合色自拍一区| 亚洲女同性videos| 亚洲欧美激情一区| 欧美一区二区三区视频免费播放| 亚洲一二三级电影| 亚洲欧美国产三级| 欧美一区国产一区| 欧美在线中文字幕| 久久精品一本久久99精品| 久久久国产亚洲精品| 久久精品在线| 欧美成人精品三级在线观看| 欧美理论大片| 国产精品极品美女粉嫩高清在线| 国产精品h在线观看| 久久久久九九视频| 久久在线视频| 欧美成人资源网| 亚洲精品无人区| 亚洲图片欧美日产| 久久国产一区| 欧美成人网在线| 欧美性猛交视频| 国产日韩欧美中文在线播放| 红桃视频国产一区| 日韩视频免费在线观看| 亚洲伊人一本大道中文字幕| 久久av红桃一区二区小说| 美腿丝袜亚洲色图| 亚洲茄子视频| 亚洲新中文字幕| 久久欧美中文字幕| 欧美三级中文字幕在线观看| 国产一区二区视频在线观看| 亚洲国产精品久久久久秋霞蜜臀| 一本一本a久久| 久久久99爱| 99re热这里只有精品视频 | 性做久久久久久久免费看| 久久久久久久综合狠狠综合| 亚洲国产精品va在线观看黑人| 亚洲一区免费网站| 牛牛国产精品| 国产亚洲欧美一区二区三区| 亚洲精品乱码久久久久久| 欧美在线免费视屏| 亚洲欧洲视频在线| 久久九九精品99国产精品| 国产精品国产三级国产a| 亚洲国产女人aaa毛片在线| 午夜国产精品视频| 亚洲毛片在线观看| 浪潮色综合久久天堂|