2011-04-06 50 views
4

我正在研究一個需要接收來自javascript的調用的插件。具體來說,它需要能夠給JavaScript一個回調函數,並且JavaScript需要能夠稍後使用至少一個字符串參數來調用該函數。 JavaScript的看起來是這樣的(理想):如何使用NPAPI從頁面上的JavaScript接收呼叫?

​​3210

我想象我的C代碼看起來像這樣,到目前爲止:

void SetCallback(void (*callback)(const char*)) { 
    NPVariant npCallback; 
    OBJECT_TO_NPVARIANT(callback, npCallback); 
    NPVariant args[] = { npCallback }; 
    size_t nargs = 1; 
    NPVariant result; 
    // gFuncs is an NPNetscapeFuncs pointer 
    NPIdentifier method = gFuncs->getstringidentifier("setCallback"); 
    // gJavaScriptAPI is an NPObject pointer 
    gFuncs->invoke(gInstance, gJavaScriptAPI, method, args, nargs, &result); 
} 

這是一個良好的開端?如果是這樣,我需要在回調函數中處理對它的調用?如果沒有,做這種事情的正確方法是什麼,或者在NPAPI中不可行?

預先感謝您。

回答

4

基本上你需要做的是提供一個實現InvokeDefault的NPObject;你將它傳遞迴頁面以響應一些Invoke或GetProperty調用,然後javascript可以隨時隨意調用它作爲函數。

有關NPObjects一般的更多信息,請參閱http://npapi.com/tutorial3

FireBreath抽象所有這一切,使90%的繁重你做的;如果你還沒有看過它,我推薦高度

+0

感謝您的回覆和鏈接! – itfische 2011-04-06 16:39:26

+0

不客氣...有沒有你沒有選擇答案的原因?如果不是這樣,你能澄清一下是什麼嗎? – taxilian 2012-01-05 16:43:02

1

我對此可能完全錯誤,但在Internet Explorer中,您使用的是window.external。但是當然,MSIE是與基於Netscape的NPAPI不​​同的架構,所以我不能確定。 無論如何,如果你必須在MSIE中這樣做,你可能會發現這個提示很有用。