0

プラグインから Javascript に配列を渡そうとしています。しかし、私はそれを行うことができません。与えられた解決策は、最初に Dom ウィンドウ オブジェクトを取得し、次に NPN_GetStringIdentifier("array") で NPN_Invoke を使用して関数を呼び出し、次に配列要素をプッシュするという同様の種類の他の投稿を参照しました。しかし、試してみると、NPN_Invoke でクラッシュしました。Dom の NPObject に「配列」に関連するメソッドがないためか、その他の理由でしょうか。

これが私のプラグイン コードです...(私の配列データは 0,1,2,...9 ループ内の i の値です)

    bool ScriptableObject::method_process_getarray_intval(const NPVariant* args, uint32_t argCount, NPVariant* result)
    {
            printf("\n DATATYPE method_process_getarray_intval");
            NPObject  DomWin;
            NPVariant Array;
            NPError   l_RetErr;
            bool      l_RetBool;
            NPIdentifier l_NPId;

            //Get the Window Object        
            l_RetErr = NPN_GetValue(m_npp,NPNVWindowNPObject,&DomWin);
            if(l_RetErr == NPERR_NO_ERROR)
                    printf("\n \t Got the Dom Window Object");
            else
                    printf("\n \t Error occured while getting the Dom Window Object");

            //Get the Array by invoking DomWin using ARRAY method of browser

            //Get string Identifier for Array
            l_NPId = NPN_GetStringIdentifier("Array");

            l_RetBool = NPN_Invoke(m_npp,&DomWin,l_NPId,NULL,0,&Array);
            if(l_RetBool)
                    printf("\n \t Invoked for Array");
            else
                    printf("\n \t Error while Invoking for Array");

            //Fill the array elements using PUSH method of Array NPVariant
            l_NPId = NPN_GetStringIdentifier("push");
            for(int i = 0;i < 10; i++)
            {
                    NPVariant *arg =(NPVariant *) g_browser->memalloc(sizeof(NPVariant));
                    INT32_TO_NPVARIANT(i,*arg);
                    NPVariant result;
                    l_RetBool= NPN_Invoke(m_npp,Array.value.objectValue,l_NPId,arg,1,&result);
                    if(l_RetBool)
                            printf("\n \t Invoked for Array i : %d",i);
                    else
                            printf("\n \t Error while Invoking for Array i :%d",i);
            }
            return true;

    }

そして、私のhtmlページは次のようになります。これが正しいかどうかはわかりません。訂正等ありましたら教えてください...

    <html>
    <script type="text/javascript">
    var inarray ;

    function handleEvent(e) {
            ...
            if (e.keyCode == 55)
            {
                            document.getElementById('arrayint_ele_get').innerHTML = inarray;
                            process_getintarray(inarray);
            }
    }

    </script>
    <script type="text/javascript">
    function  process_getintarray(inarray)
    {
            if(obj)
            {
                    obj.process_getarray_intval(inarray);
            }
    }
    </script>

    <body onload="init()" onkeydown="handleEvent(event)">

    <div id="sq" style="width:50px;height:50px;position:relative;left:0px;border:1px solid #333333;background-color:#FF0000"></div>
    ......
    <div style="position:absolute;left:100px;top:10px"> PLUGIN-SCRIPTS </div>
    <div id ="arrayint_ele_get" style="position:absolute;left:100px;top:300px"> ARRAY_GETINT VAL </div>
    .....
    </body>

    </html>

どんな提案も大歓迎です....

4

1 に答える 1

0

あなたが私たちに与えたものから私が収集できることから、あなたのNPNFuncs関数ポインタが正しく設定されていない(したがってあなたは悪い関数を呼び出している)か、何らかの理由であなたのm_nppが壊れていると思います。もちろん、これらのいずれかが当てはまる場合は、DOMWindowオブジェクトを要求することもできなくなると思います。

それを超えて推測するには、おそらくもっと多くのコードが必要でしょう。すべてを自分で行うのではなく、FireBreathまたはnixysaの使用を検討することをお勧めします。NPAPIを扱うのではなく、実際のプラグインに集中できます。ちょっとした考え。

次に考えますが、NPN_Invokeはg_browser-> invokeを呼び出していますか?'hasmethodをチェックしていると言ったのに、振り返ってNPN_HasMethodを呼び出したからです。それがすべて正しく配線されていない場合、それは間違いなくそのような問題を引き起こすでしょう。

結局のところ、どこかで、ポインタの1つがオフになっているということです。可能性は次のとおりです。

  • NPN_InvokeとNPN_HasMethodがg_browserで正しいメソッドを呼び出していません
  • g_browser(NPNFuncs構造体)に有効な関数ポインターがありません
  • nppが無効です(正しく保存されていないなど)

私はそれが他の何よりもどうであるかを見ることができません。

于 2012-08-03T05:14:18.407 に答える