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

我的玻璃盒子

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

先說一句題外話,上一節(jié)一開始我提到了由于.rc導(dǎo)致我自己寫的插件不能被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調(diào)用。

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

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

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

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

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

先來看看NPN_CreateObject方法的定義:

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

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

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

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

 

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

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

static NPIdentifier s_idSetArgs;

2、在插件對象構(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    如果某個方法支持(使用HasMethod檢測),當(dāng)頁面上Javascript代碼調(diào)用該方法時,會執(zhí)行本函數(shù)
///
/// @param [in] name    方法名
/// @param [in] args    參數(shù)值(數(shù)組)
/// @param [in] argCount    參數(shù)個數(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ù)的接收,這里舉個例子。比如網(wǎng)頁上這么調(diào)用:

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))  //如果兩者都是字符串類型(當(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ù)需要進行修改。這里限定第一個參數(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)存存儲到我們熟悉的C
            strcpy(paramPair.pValue, npsValue.utf8characters);

            m_vecParamPair.push_back(paramPair);
        }
    }
}

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

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

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

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

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

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

評論

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

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

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

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

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

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

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

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

# 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ù)  更多評論   

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

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

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

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

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

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

# 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!  回復(fù)  更多評論   

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

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

導(dǎo)航

<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

統(tǒng)計

  • 隨筆 - 49
  • 文章 - 9
  • 評論 - 588
  • 引用 - 0

常用鏈接

留言簿(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>
              狼狼综合久久久久综合网| 麻豆久久精品| 国产真实乱偷精品视频免| 国产乱码精品一区二区三区av| 另类欧美日韩国产在线| 欧美交受高潮1| 国产精品海角社区在线观看| 国产日韩欧美一区| 亚洲激情在线激情| 亚洲午夜免费福利视频| 久久经典综合| 亚洲成色www久久网站| 91久久精品美女高潮| 一本到高清视频免费精品| 一区二区高清视频| 亚洲一区在线直播| 久久xxxx精品视频| 老司机一区二区三区| 欧美另类99xxxxx| 国产美女在线精品免费观看| 亚洲电影免费观看高清完整版在线观看 | 亚洲精品在线观| 午夜综合激情| 欧美日本一区二区三区| 国产视频一区免费看| 亚洲九九九在线观看| 久久精品国产精品亚洲综合| 欧美高清hd18日本| 亚洲欧美一区二区三区在线| 欧美高清在线精品一区| 国产亚洲一区在线播放| 亚洲一区二区三区精品视频| 久久久国产精品一区| av成人毛片| 欧美精品国产精品日韩精品| 国产专区一区| 久久精品国产视频| 亚洲无限乱码一二三四麻| 欧美激情亚洲| 亚洲全部视频| 亚洲欧美韩国| 亚洲人成网站精品片在线观看| 亚洲视频在线视频| 欧美激情影音先锋| 久久综合久久综合这里只有精品| 国产精品久久久久久久久搜平片| 99riav国产精品| 亚洲福利视频在线| 久久综合国产精品| 欲香欲色天天天综合和网| 欧美在线影院| 欧美一级二级三级蜜桃| 国产老肥熟一区二区三区| 亚洲自拍偷拍网址| 亚洲视频电影在线| 国产精品嫩草久久久久| 午夜一区二区三区在线观看| 在线视频欧美日韩精品| 国产精品久久久久久妇女6080| 一区二区日本视频| 一区二区三区免费网站| 国产精品久久看| 性色av一区二区三区| 午夜精品久久久久久99热软件| 国产精品推荐精品| 久久香蕉精品| 美女主播精品视频一二三四| 亚洲老板91色精品久久| 亚洲免费高清视频| 国产精品日韩欧美综合| 久久精品中文字幕免费mv| 久久九九精品99国产精品| 亚洲激情av在线| 亚洲国产黄色片| 欧美全黄视频| 久久av一区| 免费不卡视频| 亚洲自拍偷拍网址| 久久精品30| 日韩视频永久免费| 亚洲欧美日本国产专区一区| 在线日本高清免费不卡| 日韩网站在线看片你懂的| 国产精品美女| 欧美大片免费久久精品三p| 欧美日韩一区二区三区| 久久久久99| 欧美久久久久久| 久久久久免费视频| 欧美精品一区二区三区一线天视频 | 女女同性精品视频| 亚洲午夜精品国产| 久久精品中文字幕一区| 在线亚洲一区二区| 久久精品女人天堂| 亚洲一区二区三区免费视频| 久久九九免费| 亚洲欧美日韩专区| 欧美电影美腿模特1979在线看| 欧美影院一区| 欧美日韩亚洲网| 欧美一区二区三区啪啪| 久久精品一区二区三区中文字幕| 亚洲国产一区二区三区青草影视| 夜夜嗨一区二区| 亚洲国产精品123| 亚洲欧美激情四射在线日| 亚洲三级电影全部在线观看高清| 亚洲欧美日本另类| 亚洲视频一区二区| 你懂的视频一区二区| 久久久综合网| 国产精品婷婷| 亚洲视频自拍偷拍| 亚洲午夜精品久久| 欧美日本在线视频| 亚洲福利在线看| 在线播放精品| 久久久精品一区| 久久久久久久久蜜桃| 国产视频欧美| 香蕉久久夜色精品国产| 午夜精品短视频| 国产精品久久久久一区| 宅男噜噜噜66一区二区| 亚洲视频在线观看| 欧美日韩免费观看一区二区三区 | 欧美国产先锋| 在线观看日韩av先锋影音电影院| 欧美一区二区私人影院日本 | 欧美日韩高清在线一区| 亚洲电影免费在线观看| 最新成人av在线| 牛牛影视久久网| 亚洲肉体裸体xxxx137| 日韩午夜免费| 欧美日韩一区二区三区高清| 一本久久综合| 久久激情一区| 在线播放日韩| 欧美精品福利视频| 一区二区三区欧美在线| 一区二区免费在线观看| 亚洲国产另类久久久精品极度| 国产午夜精品理论片a级大结局| 亚洲素人一区二区| 性色av一区二区怡红| 国产日韩欧美一区二区三区四区| 亚洲欧美日韩电影| 久久精品亚洲一区二区| 激情六月婷婷综合| 欧美高清免费| 亚洲午夜电影在线观看| 久久九九电影| 亚洲精品日韩综合观看成人91| 欧美日韩免费一区二区三区视频| 一区二区欧美日韩视频| 久久国产精品72免费观看| 在线欧美日韩精品| 欧美日韩国产高清| 香蕉亚洲视频| 亚洲国产国产亚洲一二三| 免费av成人在线| 亚洲校园激情| 久久成人国产精品| 亚洲国产精品专区久久| 欧美午夜精品理论片a级按摩| 午夜精品一区二区三区在线播放| 蜜桃久久av一区| 亚洲视频网站在线观看| 激情欧美丁香| 国产精品免费一区二区三区观看| 久久精品综合| 亚洲一品av免费观看| 欧美国产日本高清在线| 亚洲欧美中文在线视频| 亚洲精品视频免费| 国产三级欧美三级| 欧美日韩的一区二区| 久久精品道一区二区三区| 夜夜嗨av一区二区三区中文字幕| 乱人伦精品视频在线观看| 亚洲神马久久| 亚洲激情影视| 黄色亚洲网站| 国产欧美91| 欧美日一区二区在线观看 | 亚洲天堂av综合网| 亚洲第一级黄色片| 国产日本欧美一区二区| 欧美日韩中文字幕在线| 美女久久一区| 久久精品首页| 欧美一区在线看| 亚洲在线观看免费视频| 一区二区三区色| 艳女tv在线观看国产一区| 亚洲第一毛片| 欧美激情亚洲激情| 欧美成人一区二区|