0

all.js関数を呼び出して、プラグインで何かを表示したい.これは私のコードです

NPObject* npwindow = NULL; 
NPError ret = browser->getvalue(mInstanceForJS, NPNVWindowNPObject, &npwindow); 
if (ret != NPERR_NO_ERROR) 
    return ; 
// Get window object. 
NPVariant windowVar; 
NPIdentifier winID = browser->getstringidentifier("window"); 
bool bRet = browser->getproperty(mInstanceForJS, npwindow, winID, &windowVar); 
if (!bRet) 
{ 
    browser->releaseobject(npwindow); 
    return ; 
}
NPObject* window = NPVARIANT_TO_OBJECT(windowVar);
NPVariant voidResponse;

NPVariant elementId;
STRINGZ_TO_NPVARIANT([info UTF8String], elementId);
NPVariant args[] = {elementId};

NPIdentifier funcID= browser->getstringidentifier([funName UTF8String]);
bRet = browser->invoke(mInstanceForJS, window, funcID, args, 1, &voidResponse);
browser->releasevariantvalue(&windowVar);

呼び出されたとき bRet = browser->invoke(mInstanceForJS, window, funcID, args, 1, &voidResponse); ,Safariが応答しません。エラーはありますか?

4

1 に答える 1

0

npwindowはすでにウィンドウオブジェクトです。「window.window」を効果的にクエリしています。確かに、なぜこれが機能しないのかわかりませんが、少し奇妙に思えます。

それが問題1です。

問題#2は、STRINGZ_TO_NPVARIANTを使用してUTF8Stringの結果を格納していることです。STRINGZ_TO_NPVARIANTはメモリをコピーしないため、関数がその文字列にハングアップしたい場合は、自動解放プールが循環するときに返される文字列が解放されるため、問題が発生する可能性があります。もちろん、それはメモリリークの可能性もあります。いずれにせよ、文字列をブラウザに渡す正しい方法は、NPN_MemAllocを使用して文字列にメモリを割り当て、文字列をコピーすることです。次に、そのポインタをブラウザに渡します。詳細については、 http://npapi.com/memoryを参照してください。

問題#3は、このコードをいつ実行しているのかがわからないことです。プラグインまたはページのライフサイクルの早い段階でこのコードを実行しようとしている可能性があり、そのために機能しない可能性があります。

次に、別の質問があります。「Safariが応答できない」とはどういう意味ですか?文法上の誤りを忘れて、これが何を意味するのかわかりません。ハングしますか?bRetはfalseですか?コンピューターが突然氷に包まれて、すべての処理が停止しますか?上記が役に立たない場合は、これらの質問に答えてください。もう一度やり直します。

于 2013-01-15T04:47:07.390 に答える