2008年9月5日 星期五

[Plugin] 如何為你的 firefox plugin 加上新的 method

如果我想在 plugin 裡新增一個 method, 那該怎麼做?

ex:

      新增一個 method name= MYfunction

 

這篇文章內容包含

      1. Java Script 呼叫 npapi plugin 物件的最簡單設定

      2. 如何讀取 Java Script 傳來的參數

      3. 如何轉換 utf8 字串到 Windows TCHAR 字串

----------------------------------------------------------

注意:

如果你還沒看過下面的文章

[Plugin] 撰寫 firefox plugin 最簡單方法

請仔細閱讀, 這兩篇文章緊密相關.

----------------------------------------------------------

 

最簡單最笨的操作步驟如下:

Step 1: 加入 method 名稱標記
    在 plugin.cpp 中的 CPlugin method 中加入 method 的標記

ex:
    CPlugin::CPlugin(NPP pNPInstance) ..{

            MYfunction_id=NPN_GetStringIdentifier("MYfunction");
    }

 

Step 2: 宣告 method 名稱標記 

ex:
    static NPIdentifier MYfunction_id;

 

Step 3: 告訴別人你的元件有這個 method
ex:
    bool ScriptablePluginObject::HasMethod(NPIdentifier name){
        if(name == MYfunction_id)
            return true;
    }

 

Step 4: 當 script 呼叫你的 method 時, 提供你 method 的實做

ex:
    bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args,uint32_t argCount, NPVariant *result) {
          DWORD dwThreadID;

         if(name == MYfunction_id ){
            MessageBox(NULL,L"呼叫 MYfunction_id",L"Java Script 呼叫範例",MB_OK);
            return PR_TRUE;
          }

          return PR_FALSE;
    }

 

如何讓 JavaScript 傳參數給你的 plugin method 呢?

如果 Java Script 呼叫的 method 有參數, 我們要如何取出參數資料呢
例如:
    Myfunction("192.168.0.1",1234);

=== in Invoke method ===
// 第一個參數: "192.168.0.1"
    NPVariant varIP=args[0];
    NPString npstrIP=NPVARIANT_TO_STRING(varIP); // 取出 "192.168.0.1"


    // 印出來看看: 將 utf8 字串 轉成 Wide Char
    int   length=MultiByteToWideChar(CP_UTF8,0,(char*)npstrIP.utf8characters,-1,NULL,0);
    TCHAR *strIP=new TCHAR[length];
    MultiByteToWideChar(CP_UTF8,0,(char*)npstrIP.utf8characters,-1,strIP,length);
    MessageBox(NULL,strIP,_T("呼叫 funPassVar_id: 第一個參數\n"),MB_OK);
    delete[] strIP;

    // 第二個參數: 1234
    NPVariant varValue=args[1];
    int32_t value=NPVARIANT_TO_INT32(varValue);

    //印出來看看: 印出 int32 的內容
    TCHAR msg[100];
    _stprintf(msg,_T("value=%d"),value);
    MessageBox(NULL,msg,_T("呼叫 funPassVar_id: 第二個參數\n"),MB_OK);
=============================================

希望對你有幫助.

by Jing

3 則留言:

  1. 那如何傳遞參數給JS呢?
    你能不能寫點關于其他類似關鍵代碼的修改或添加?
    謝謝

    回覆刪除
  2. 呵呵 我還是那個要你給你留言,要你發個最簡單的PLUGIN的朋友,現在搞了3個禮拜這個了,還是不會動手寫,資料只看官方那個文檔,看得也云里霧里,唉,NPAPI EXTENSION資料也太少了,網上也沒什么其他例子。真是比較頭疼!

    回覆刪除
  3. http://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins
    裡面的項目 "Accessing browser objects from a plugin"

    有提到怎麼做, 雖然很簡陋卻是線索

    另外, 在下面的範例程式中:
    http://mxr.mozilla.org/seamonkey/source/modules/plugin/samples/npruntime/plugin.cpp

    在第 411 行到 458 行有簡單的範例,

    我想裡面是把資料寫回 html 元件的範例.

    請注意, 這段 code 在我的解說步驟第九項被移除,
    並且改成簡單的 Message 呼叫.

    MessageBox(NULL,L"foo 被呼叫 ",L"Java Script 呼叫範例",MB_OK);

    你可以參考原來的 code 並且根據你的 html 物件
    重新寫一段.


    真的很抱歉,最近幾天我抽不出時間寫範例.

    如果你解決了你的問題, 也可以像我一樣提供給大家,
    讓大家都能節省時間,

    讓大家週末都可以看看到大草原與遼闊的大海, 不用再為程式煩惱了.

    ^_^

    回覆刪除