4. 實作從ActiveX調用網頁中的javascript.
設計思路:從上述項目中産生的calc.html中建立一個js函數來調用控件的CallWebJs方法,而CallWebJs方法又調用頁面中的js方法printMsg();
具體操作如下:同3中的做法,再為控件添加一個方法命名為CallWebJs,
在calc.cpp中找到該方法,并實作如下:
STDMETHODIMP Ccalc::CallWebJs(VARIANT scriptCallback)
{
// TODO: Add your implementation code here
CComPtr<IDispatch> spCallback;
if (scriptCallback.vt == VT_DISPATCH)
spCallback = scriptCallback.pdispVal;
CComVariant avarParams[1];
avarParams[0] = "hhheeee"; //指定回調函數的參數
DISPPARAMS params = { avarParams, NULL, 1, 0 };
if(spCallback)
spCallback->Invoke(0,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&params, NULL, NULL, NULL);
return S_OK;
}
在calc.html中添加調用按鈕,html檔案修改如下:
<HTML>
<HEAD>
<TITLE>ATL 8.0 test page for object calc</TITLE>
</HEAD>
<BODY>
<OBJECTID="calc"CLASSID="CLSID:4A524B99-8CAF-44E9-B788-70536908F048"></OBJECT>
<inputtype="button"value="Add"onclick="add();"/>
<inputtype="button"value="CallWebJs"onclick="test()"/>
<scripttype="text/javascript">
function add() {
var calc = document.getElementById('calc');
var result = calc.Add(2, 3);
alert(result);
}
function test() {
var calc = document.getElementById('Calc');
var result = calc.CallWebJs(printMsg);
function printMsg(msg) {
alert(msg);
</script>
</BODY>
</HTML>
單擊頁面中的CallWebJs按鈕,看到效果,實作通過ActiveX回調Js.
注:
樓主是個新人哦,隻是把自己遇到的問題記錄了下來,請批判性的閱讀,若是有什麼錯誤還請指出哦:-),文章之前的回調函數參數在js中指定,調用後會造成scriptCallback.vt的類型不正确,進而導緻Invoke無法被觸發,現将參數在回調函數中指定。另,不太推薦這種回調方法,使用這種方法,不是很靈活,尤其是在參數的指定方面,最好采用事件觸發的方法,在ActiveX中建立事件和事件函數,由js中綁定的方法,後續文章詳細介紹,也可以網上搜搜哦。。