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

我的玻璃盒子

【原創(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é)我來簡單說一下如何為插件添加和腳本語言(如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)建插件對象的實(shí)例,NPP_SetWindow中,瀏覽器會(huì)傳入插件窗口的信息,最后一個(gè)NPP_GetValue,是瀏覽器來獲取一些插件信息的。NPP_GetValue函數(shù)的結(jié)構(gòu)是這樣的:

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

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

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

上面有個(gè)問題:如何創(chuàng)建我們自己的NPObject對象?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對象,并且NPClass要求的所有基礎(chǔ)方法,都由一個(gè)ScriptablePluginObjectBase類來提供。我們根據(jù)需要,來創(chuàng)建不同的繼承于ScriptablePluginObjectBase的類(比如支持方法的類和支持屬性的類),傳給DECLARE_NPOBJECT_CLASS_WITH_BASE宏,這樣,當(dāng)瀏覽器管我們“要”的時(shí)候,我們就可以按照它的需要“給”它對應(yīng)的對象。

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

 

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

1、添加一個(gè)方法(或?qū)傩裕┖芎唵?,先定義一個(gè)靜態(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    如果某個(gè)方法支持(使用HasMethod檢測),當(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é)構(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) 閱讀(16702) 評(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)

你好,我想請問下, 能通過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ù),傳遞給插件對象呢?就是在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)航

<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

統(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>
              欧美成人福利视频| 国产一区二区三区av电影| 一区二区高清视频在线观看| 欧美成人第一页| 欧美激情精品久久久久久蜜臀| 免费在线看一区| 欧美激情四色| 亚洲精品女av网站| 久久九九精品99国产精品| 久久久亚洲午夜电影| 欧美v国产在线一区二区三区| 嫩草国产精品入口| 亚洲电影在线免费观看| 亚洲精品综合| 午夜在线精品| 免费在线一区二区| 欧美视频不卡| 黄色成人在线免费| aa级大片欧美三级| 久久久精品一区| 亚洲国产日日夜夜| 午夜精品久久久久99热蜜桃导演| 久久成人18免费观看| 欧美xart系列高清| 国产乱理伦片在线观看夜一区| 好吊一区二区三区| 亚洲无毛电影| 欧美激情国产精品| 亚洲欧美一区在线| 欧美日韩亚洲一区三区| 1024成人| 久久国产婷婷国产香蕉| 亚洲乱码国产乱码精品精可以看| 欧美在线观看www| 欧美日精品一区视频| 精品91久久久久| 亚久久调教视频| 亚洲精品久久久久| 久热精品视频在线| 国产一区二区三区丝袜| 亚洲女同在线| 日韩视频在线观看免费| 久久一日本道色综合久久| 国产亚洲精品久久久久久| 亚洲午夜高清视频| 亚洲国产经典视频| 久久伊人亚洲| 好吊色欧美一区二区三区四区| 亚洲男同1069视频| 亚洲精品一区在线| 欧美精品福利视频| 亚洲免费观看高清完整版在线观看熊| 老鸭窝毛片一区二区三区| 午夜欧美不卡精品aaaaa| 欧美激情bt| 久久综合亚州| 一区二区视频欧美| 看欧美日韩国产| 欧美在现视频| 国产一区二区三区网站| 久久精品官网| 午夜精品一区二区三区电影天堂 | 一区二区三区高清在线| 美日韩在线观看| 久久久999成人| 1024成人| 亚洲久久一区| 欧美体内谢she精2性欧美| 亚洲深夜影院| 亚洲女同精品视频| 国产中文一区二区| 久久免费视频在线| 久久全国免费视频| 亚洲区在线播放| 亚洲伦理在线| 国产精品一区免费视频| 欧美在线视频一区| 久久精品国产一区二区三区免费看 | 国产精品电影在线观看| 亚洲欧美日韩精品久久奇米色影视| 夜夜精品视频一区二区| 国产精品二区影院| 久久精品99无色码中文字幕| 久久高清国产| 最近看过的日韩成人| 日韩天天综合| 国产欧美日韩另类一区| 麻豆精品网站| 欧美日韩岛国| 久久久99久久精品女同性| 免播放器亚洲一区| 午夜精品久久久久久久久久久| 久久激情综合网| 一级成人国产| 久久经典综合| 在线中文字幕日韩| 久久精品视频免费观看| 中文久久精品| 亚洲一区在线视频| 亚洲国产精品一区制服丝袜| 一本色道久久88综合亚洲精品ⅰ | 欧美在线高清| 久久久噜噜噜久久久| 在线视频一区观看| 久久精品一区| 亚洲一区免费| 美女诱惑一区| 久久精品国产一区二区电影| 欧美激情精品久久久久| 久久精品中文字幕免费mv| 欧美女主播在线| 另类成人小视频在线| 国产精品久久久久影院亚瑟 | 亚洲电影在线| 亚洲在线观看免费视频| 99精品视频免费全部在线| 久久久蜜桃精品| 亚洲欧美一区在线| 欧美私人网站| 亚洲片在线资源| 亚洲国产精品va在线观看黑人| 香蕉成人久久| 午夜精品久久久久久99热| 欧美日韩另类字幕中文| 亚洲国产日韩欧美在线图片| 亚洲成色777777在线观看影院| 亚洲欧美综合国产精品一区| 亚洲欧美成人| 国产精品成人在线观看| 亚洲免费精彩视频| 一区二区三区欧美成人| 欧美精品99| 亚洲国产精品久久久久| 精品成人在线视频| 久久成人免费| 毛片一区二区| 亚洲成色精品| 蜜臀av一级做a爰片久久 | 午夜宅男久久久| 久久gogo国模裸体人体| 国产日本欧美一区二区三区| 亚洲女人天堂成人av在线| 久久er99精品| 激情久久婷婷| 久久影视三级福利片| 欧美成人一区二区在线| 亚洲国产日韩欧美一区二区三区| 久久综合亚洲社区| 亚洲精品欧美一区二区三区| 99热免费精品| 欧美性猛交xxxx乱大交退制版| 一本大道av伊人久久综合| 亚洲欧美日韩在线观看a三区| 国产日产欧产精品推荐色| 欧美中文字幕| 欧美二区视频| 亚洲一区二区三区三| 国产欧美欧洲在线观看| 久久精品国产视频| 欧美黄色一区| 中日韩美女免费视频网址在线观看| 欧美日韩一区二区三区在线观看免| 洋洋av久久久久久久一区| 欧美在线影院在线视频| 亚洲国产成人久久综合| 欧美大色视频| 亚洲在线免费观看| 亚洲欧洲日韩女同| 欧美性大战久久久久久久蜜臀| 亚洲欧美一区二区三区极速播放 | 美腿丝袜亚洲色图| 日韩一级黄色片| 国产欧美日韩精品专区| 久久嫩草精品久久久久| 日韩一区二区精品葵司在线| 久久精品女人| 夜夜狂射影院欧美极品| 国模精品娜娜一二三区| 欧美日韩国产va另类| 欧美在线视屏| 国产精品99久久久久久久久久久久| 免费亚洲电影| 久久精品免费看| 亚洲一区免费视频| 亚洲精品综合在线| 国产综合色精品一区二区三区| 欧美极品一区| 久久九九国产精品| 亚洲神马久久| 最新中文字幕一区二区三区| 久久久久国产成人精品亚洲午夜| 亚洲神马久久| 日韩亚洲欧美一区二区三区| 狠狠操狠狠色综合网| 国产精品久久久| 欧美日韩国产在线播放| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美亚洲系列| 一区二区三区国产盗摄| 激情成人中文字幕|