• <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組件中調(diào)用JavaScript函數(shù)
              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);        // 激發(fā)連接點事件
             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)        // 激發(fā)屬性事件
             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組件中調(diào)用JavaScript函數(shù)
             52
             532.從頁面javascript向Com組件傳遞結(jié)構(gòu)數(shù)組
             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// 數(shù)組長度 或 屬性 個數(shù)
             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;       // 直接讀取數(shù)組長度
             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;       // 從類型信息讀取數(shù)組長度
             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窗口的內(nèi)容,并調(diào)用其中的腳本
            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 函數(shù)名
            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中執(zhí)行腳本
            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>中對應的代碼是什么?我仿照你創(chuàng)建了put_onstate(IDispatch *newVal),還是顯示沒有這個方法。  回復  更多評論
              

            <2008年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(6)

            隨筆分類(35)

            隨筆檔案(51)

            文章分類(3)

            文章檔案(3)

            相冊

            我的鏈接

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久国产午夜精品一区二区三区| 久久免费国产精品| 久久久久亚洲精品日久生情 | 国产精品久久久久乳精品爆| 久久精品亚洲精品国产色婷| 无码国内精品久久人妻蜜桃| 狠狠色婷婷久久综合频道日韩| 亚洲精品乱码久久久久久蜜桃 | 国产产无码乱码精品久久鸭| 色8久久人人97超碰香蕉987| 性欧美大战久久久久久久久| 久久久精品人妻一区二区三区蜜桃| 久久亚洲日韩精品一区二区三区| 久久久久亚洲精品天堂| 国产美女久久精品香蕉69| 久久精品国产一区二区三区日韩| 免费观看久久精彩视频| 精品久久久久久无码中文野结衣| 久久精品三级视频| 久久久国产视频| 中文字幕久久波多野结衣av| 精品综合久久久久久888蜜芽| 波多野结衣中文字幕久久| 18岁日韩内射颜射午夜久久成人| 国产女人aaa级久久久级| 亚洲综合久久久| 久久精品国产亚洲AV高清热| 久久久久久久尹人综合网亚洲| 久久久精品久久久久久 | 日韩久久久久久中文人妻| 久久久久久久人妻无码中文字幕爆 | 久久中文字幕精品| 人妻无码αv中文字幕久久琪琪布| 97久久久精品综合88久久| 久久久国产精华液| 精品免费久久久久久久| 久久久久亚洲av成人无码电影| 久久久久高潮综合影院| 国产免费福利体检区久久| 婷婷伊人久久大香线蕉AV| Xx性欧美肥妇精品久久久久久|