2011-10-11 71 views
3

我想將JavaScript對象(JSON和函數對象)傳入我的ActiveX控件。理想情況下,我可以操縱JavaScript對象(例如讀取或修改JSON),並從ActiveX控件內部執行JavaScript函數調用(使用C++)。這是否有可能,還是我必須解決通過字符串?是否有可能將JavaScript對象傳遞給ActiveX(並使用它們)?

例如,以下是我在Firefox中可以做的事情。請注意,我有一個JSON對象的引用,而我也可以執行JavaScript函數調用:

NPString jsonToString(NPP instance, NPObject* json) 
{ 
    NPVariant result; 
    NPVariant arg; 
    NPIdentifier identifier; 

    /* Get the global object */ 
    NPObject* windowObj = NULL; 
    g_NPNFuncs.getvalue(instance, NPNVWindowNPObject, &windowObj); 

    /* Get JSON object */ 
    identifier = g_NPNFuncs.getstringidentifier("JSON"); 
    g_NPNFuncs.getproperty(instance, windowObj, identifier, &result); 
    NPObject* jsonObj = NPVARIANT_TO_OBJECT(result); 

    /* Call stringify */ 
    identifier = g_NPNFuncs.getstringidentifier("stringify"); 
    OBJECT_TO_NPVARIANT(json, arg); 
    g_NPNFuncs.invoke(instance, jsonObj, identifier, &arg, 1, &result); 

    return NPVARIANT_TO_STRING(result); 
} 


編輯 - 這是我想出了一個解決方案:

IDL文件:

[id(TEST_ID)] BSTR Test(BSTR data, IDispatch* function); 


調度映射:

DISP_FUNCTION_ID(CApp, "test", TEST_ID, Test, VT_BSTR, VTS_BSTR VTS_DISPATCH) 


界面功能:

BSTR Test(BSTR data, IDispatch* function) 


調用JavaScript函數對象:

VARIANTARG args[1]; 
args[0].vt = VT_BSTR; 
args[0].bstrVal = _bstr_t(dataStr).GetBSTR(); 

DISPPARAMS params; 
params.cArgs = 1; 
params.cNamedArgs = 0; 
params.rgvarg = args; 

HRESULT hresult = function->Invoke(0, IID_NULL, 
    LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL); 

調用的IDispatch ::爲0的DISPID調用似乎對調用工作函數對象。但是,要調用對象的方法,您必須首先獲得相應的DISPID,正如Taxilian所說。 GetNextDispID應該爲此工作(IDispatchEx的第一個QueryInterface;轉換爲IDispatchEx似乎也可以,但也許不安全)。

+0

你應該看看這個問題:[從ActiveX傳遞字節數組到JavaScript,反之亦然](http:// stackoverflow。COM /問題/ 1926723 /通過陣列 - 的字節從 - 的ActiveX到的JavaScript和 - 反之亦然)。只要你'串化'你的對象,並將其作爲字符串(obv)傳遞,你就是金。 –

+0

是的,我看到了這個問題。字符串化不一定是我想要做的唯一事情;這只是一個例子。也就是說,如果事實證明這太複雜,我最終可能會傳遞字符串。 –

回答

2

哇,我今天aparently不是很亮,因爲我只是寫了一個答案完全缺失的,你說的NPAPI插件代碼就是一個例子=部分]

所以,回答正確的問題,是的您可以。 ActiveX中與NPObject最爲相關的類型是IDispatch(或IDispatchEx)。您只需調用Invoke並告知它是否應該獲取屬性,設置屬性或調用方法,而不是擁有GetProperty,SetProperty和Invoke。您首先必須查詢以獲取有問題的成員的DISPID;類似於NPIdentifier,DISPID是字符串和數字之間的映射。

如果你還沒有看到它,你應該看看FireBreath,它提供了一個抽象,允許你編寫一個插件,可以在NPAPI和ActiveX上使用相同的代碼庫。它有一個wrapper to allow it to use IDispatch objects,你可能會發現有用的例子。通過使用IDispatch(甚至更好,IDispatchEx),您可以使用JS對象與使用NPObject幾乎相同的方式。 JavaScript中的大部分內容都是通過IDispatchEx來實現的,但偶爾我會看到需要支持IDispatch故障轉移的實例。

希望它有幫助,並且我希望我的初步反應(在我重新閱讀您的問題之前)沒有讓您失望。

+0

所以我在接口中的函數中添加了一個IDispatch *參數(在IDL文件中定義)。然後我將它鑄造成IDispatchEx(無法在IDL中指定它,因爲它似乎不喜歡DispEx.h頭文件)。這一切似乎都沒有問題。但是,如果我傳入JavaScript函數對象,您是否有任何想法如何調用它? GetNextDispID不返回任何成員。順便說一句,FireBreath代碼有助於我們研究 - 這太糟糕了,由於商業問題,我暫時無法使用它。 –

+0

沒關係,我發現我可以從這裏調用dispid 0:http://stackoverflow.com/questions/1681327/is-dispid-value-reliable-for-invokes-on-idispatchs-from-scripts –

相關問題