• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            幽幽
             
            posts - 51,  comments - 28,  trackbacks - 0

             

              11.在COM組件中調用JavaScript函數
              2// 連接點方式頁面javascript腳本
              3<object classid="CLSID:B568F111-DFE4-4944-B67F-0728AB2AB30F" id="testCom" VIEWASTEXT></object>
              4<script language="JavaScript" for="testCom" event="staTe(s)">
              5        alert("State(" + s + ")");
              6        return 123;
              7</script>
              8<script language="JavaScript">
              9        testCom.FireStateEvent("Hello");
             10</script>
             11
             12// 事件屬性方式頁面javascript腳本
             13function onState(s){
             14        alert("onState(" + s + ")");
             15        return 456;
             16}

             17var o = new ActiveXObject("TestATL.TestCom");
             18o.onstaTe=onState;
             19o.FireStateEvent("Hello");
             20
             21// Com組件VC7.1 ATL代碼
             22__interface _ITestComEvents{
             23        [id(1), helpstring("State事件")] HRESULT State([in] BSTR str);
             24}
            ;
             25__event __interface _ITestComEvents;
             26IDispatchPtr m_onState;        // 事件屬性
             27STDMETHOD(get_onState)(IDispatch** pVal) {
             28        *pVal = m_onState;
             29        return S_OK;
             30}
            ;
             31STDMETHOD(put_onState)(IDispatch* newVal) {
             32        m_onState = newVal;
             33        return S_OK;
             34}
            ;
             35STDMETHOD(FireStateEvent)(BSTR str) {
             36        __raise State(str);        // 激發連接點事件
             37        CComVariant result;
             38        CComVariant avarParams[1= {str};
             39        DISPPARAMS dispParams = {avarParams, NULL, 10};
             40        EXCEPINFO excepInfo;
             41        memset(&excepInfo, 0sizeof excepInfo);
             42        UINT nArgErr = (UINT)-1;      // initialize to invalid arg
             43        if (m_onState)        // 激發屬性事件
             44            HRESULT hr = m_onState->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT,
             45                DISPATCH_METHOD, &dispParams, &result, &excepInfo, &nArgErr);
             46        return S_OK;
             47}

             48參見:
             49How To Call a Script Function from a VC WebBrowser Application
             50如何在COM object中使用 Javascript function object?
             51在COM組件中調用JavaScript函數
             52
             532.從頁面javascript向Com組件傳遞結構數組
             54// 頁面腳本
             55var o = new ActiveXObject("TestATL.TestCom");
             56o.onstaTe=onState;
             57o.Put("array"{01231"abc"});
             58o.Put("array", [456"def"]);
             59o.Put("array", [{name: "tom", age: 8}{name: "jack", age: 10}]);
             60var a = new Array(789"ghi"); // has "length" property
             61o.Put("array", a);
             62
             63// Com組件VC7.1 ATL代碼
             64STDMETHODIMP CTestCom::Put(BSTR key, VARIANT value)
             65{
             66WCHAR output[4096= L"";
             67if(0 == wcsicmp(key, L"array"&& VT_DISPATCH == value.vt)
             68{
             69     IDispatchPtr spDisp = value.pdispVal;
             70     DISPID dispID = 0;
             71     DISPPARAMS dispParams = {NULL, NULL, 00};
             72     CComVariant result;
             73     EXCEPINFO excepInfo;
             74     memset(&excepInfo, 0sizeof excepInfo);
             75     UINT nArgErr = (UINT)-1// initialize to invalid arg
             76     unsigned int length = 0// 數組長度 或 屬性 個數
             77
             78     LPOLESTR func = L"length";
             79     HRESULT hr = spDisp->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
             80     if(S_OK == hr){       // 如果有"length"屬性
             81      hr = spDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
             82      if(S_OK == hr && VT_I4 == result.vt)
             83       length = result.intVal;       // 直接讀取數組長度
             84     }
            else{
             85      unsigned int nTypeInfo = 0;
             86      hr = spDisp->GetTypeInfoCount(&nTypeInfo);
             87      ATLASSERT(1 == nTypeInfo);
             88      ITypeInfoPtr spTypeInfo;
             89      hr = spDisp->GetTypeInfo(00&spTypeInfo);
             90      TYPEATTR *pTypeAttr = NULL;
             91      hr = spTypeInfo->GetTypeAttr(&pTypeAttr);
             92      //ATLASSERT("{C59C6B12-F6C1-11CF-8835-00A0C911E8B2}" == pTypeAttr->guid);     // JScript: 
             93      length = pTypeAttr->cVars;       // 從類型信息讀取數組長度
             94      spTypeInfo->ReleaseTypeAttr(pTypeAttr);
             95     }

             96     for(unsigned int i=0; i<length; i++)
             97     {
             98      WCHAR buf[32];
             99      _itow(i, buf, 10);
            100      func = buf;
            101      hr = spDisp->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
            102      hr = spDisp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
            103      if(S_OK != hr)
            104       continue;
            105      if(VT_DISPATCH == result.vt){
            106       IDispatchPtr spItem = result.pdispVal;
            107       func = L"name";
            108       hr = spItem->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
            109       hr = spItem->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
            110       if(S_OK == hr && VT_BSTR == result.vt)
            111        swprintf(output + wcslen(output), L"name=%s", result.bstrVal);
            112       func = L"age";
            113       hr = spItem->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &dispID);
            114       hr = spItem->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispParams, &result, &excepInfo, &nArgErr);
            115       if(S_OK == hr && VT_I4 == result.vt)
            116        swprintf(output + wcslen(output), L" age=%d\n", result.intVal);
            117      }
            else if(VT_BSTR == result.vt)
            118       swprintf(output + wcslen(output), L"BSTR:%s\n", result.bstrVal);
            119      else if(VT_I4 == result.vt)
            120       swprintf(output + wcslen(output), L"I4:%d\n", result.intVal);
            121      else
            122       swprintf(output + wcslen(output), L"item.vt=%d\n", result.vt);
            123     }

            124}

            125FireStateEvent(output);
            126return S_OK;
            127}

            128
            1293.枚舉IE窗口的內容,并調用其中的腳本
            130#import <mshtml.tlb>       // Internet Explorer 5
            131#import <shdocvw.dll> 
            132        SHDocVw::IShellWindowsPtr spSHWinds; 
            133        spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));
            134        long nCount = spSHWinds->GetCount();
            135        IDispatchPtr spDisp;
            136        for (long i = 0; i < nCount; i++)
            137        {
            138         _variant_t va(i, VT_I4);
            139         spDisp = spSHWinds->Item(va);
            140         SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
            141         if (spBrowser != NULL)
            142         {
            143          _bstr_t location = spBrowser->GetLocationName();
            144          if(_bstr_t(L"Test DapCtrl"== location)       // 找指定IE窗口
            145          {
            146           IHTMLDocument2Ptr spDoc(spBrowser->GetDocument());
            147           if (spDoc != NULL)
            148           {
            149            _bstr_t exp = m_onState;
            150            IDispatch *pdis = NULL;
            151            hr = spDoc->get_Script(&pdis);
            152            if(pdis){
            153             DISPID tmpDispID = 0;
            154             LPOLESTR func = L"Test"// javascript 函數名
            155             hr = pdis->GetIDsOfNames(GUID_NULL, &func, 1, LOCALE_SYSTEM_DEFAULT, &tmpDispID);
            156             if(S_OK == hr)
            157              hr = pdis->Invoke(tmpDispID, IID_NULL, LOCALE_USER_DEFAULT,
            158               DISPATCH_METHOD, &dispParams, &result, &excepInfo, &nArgErr);
            159            }

            160           }

            161          }

            162         }

            163        }

            164參見:
            165HOWTO: Connect to a Running Instance of Internet Explorer
            166ActiveX組件與JavaScript交互
            167ActiveX組件控制其所在的IE窗口
            168
            1694.在VC中執行腳本
            170#import <msscript.ocx>       // msscript.ocx 
            171using namespace MSScriptControl;
            172        IScriptControlPtr pScriptControl(__uuidof(ScriptControl));
            173        LPSAFEARRAY psa;
            174        SAFEARRAYBOUND rgsabound[]       = 10 }// 1 elements, 0-based
            175        int i;
            176        psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
            177        if (!psa)
            178        {
            179         return E_OUTOFMEMORY;
            180        }

            181        VARIANT vFlavors[1];
            182        for (i = 0; i < 1; i++)
            183        {
            184         VariantInit(&vFlavors[i]);
            185         V_VT(&vFlavors[i]) = VT_BSTR;
            186        }

            187        V_BSTR(&vFlavors[0]) = SysAllocString(bstr);
            188        long lZero = 0;
            189        hr = SafeArrayPutElement(psa, &lZero,&vFlavors[0]);
            190        for(i=0;i<1;i++)
            191        {
            192         SysFreeString(vFlavors[i].bstrVal);
            193        }

            194        pScriptControl->Language = "JScript";
            195        pScriptControl->AllowUI = TRUE;
            196        _bstr_t exp = L"1+2+3";
            197        _variant_t outpar = pScriptControl->Eval(exp);
            198        //_variant_t outpar = pScriptControl->ExecuteStatement(exp);
            199        //_variant_t outpar = pScriptControl->Run("MyStringFunction", &psa);
            200        _bstr_t bstrReturn = (_bstr_t)outpar;
            201        char *pResult = (char *)bstrReturn;
            202        SafeArrayDestroy(psa);
            203參見:
            204How To Call Run() Method of the Microsoft Script Control in C++
            205
            posted on 2010-10-09 03:21 幽幽 閱讀(3441) 評論(2)  編輯 收藏 引用

            FeedBack:
            # re: ActiveX組件與JavaScript交互
            2011-11-26 18:40 | joinman
            不錯!  回復  更多評論
              
            # re: ActiveX組件與JavaScript交互
            2014-08-29 11:12 | nobody
            請問<javascript> o.onsTate = onstate
            在<ATL>中對應的代碼是什么?我仿照你創建了put_onstate(IDispatch *newVal),還是顯示沒有這個方法。  回復  更多評論
              

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(6)

            隨筆分類(35)

            隨筆檔案(51)

            文章分類(3)

            文章檔案(3)

            相冊

            我的鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            狠狠久久亚洲欧美专区| 亚洲va中文字幕无码久久| 久久精品国产色蜜蜜麻豆| 久久精品成人免费观看97| 色综合久久久久| 久久精品国产免费一区| 国产情侣久久久久aⅴ免费| 亚洲午夜久久久影院伊人| 亚洲欧美成人综合久久久| 一本色道久久88精品综合 | 久久久久久国产精品无码下载| 久久久久国产精品| 久久综合九色综合97_久久久| av无码久久久久久不卡网站| 久久99国产精品久久99果冻传媒| 国产国产成人精品久久| 91精品国产高清久久久久久国产嫩草| 国内精品久久久久影院网站| 天天影视色香欲综合久久| 久久久久久久97| 韩国三级大全久久网站| 国产99久久久久久免费看| 香蕉aa三级久久毛片| 无码久久精品国产亚洲Av影片| 国产精品久久久久9999| 久久久99精品成人片中文字幕 | 免费无码国产欧美久久18| 无码人妻久久一区二区三区免费| 国产精品一久久香蕉国产线看| 91久久福利国产成人精品| 久久亚洲精品国产精品婷婷| 久久久精品国产sm调教网站| 国产精品狼人久久久久影院| 精品人妻伦九区久久AAA片69| 久久久久久免费一区二区三区| 青青热久久国产久精品| 国产精品久久久久久| 久久无码中文字幕东京热| 夜夜亚洲天天久久| 久久综合给合久久狠狠狠97色69| 久久本道久久综合伊人|