天天看點

一步一步實作ActiveX與js雙向調用(二)

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中綁定的方法,後續文章詳細介紹,也可以網上搜搜哦。。

繼續閱讀