VC++开发的ActiveX如何通过JavaScript脚本和EOS应用交互

由于一些特殊的业务场景,用EOS开发的应用需要采用VC++开发的ActiveX控件,下面介绍如何采用在ActiveX控件中,用过JavaScript脚本实现和EOS应用的交互。

1.1   如何从ActiveX中访问HTML中的JS方法
1.1.1   在JS中设计一个方法
function testFunc(a,b){
              alert("调用JavaScript中方法(连接字符串):"+( a+b));
}
1.1.2   为CDemoDialog增加新的方法
void CDemoDialog::CalJSFunction(const CString &funcName,DISPPARAMS &dispparams){
//这里描述了如何让ocx与ie进行交互
       CDemoCtrl* pCtrl = (CDemoCtrl*)GetParent();
       if(pCtrl)
       {
              CComPtr<IOleClientSite> pSite;
              pSite = pCtrl->GetClientSite();
              if(pSite)
              {
                     CComPtr<IOleContainer> pContainer;
                     HRESULT hr = pSite->GetContainer(&pContainer);
                     if(FAILED(hr))
                     {
                            return;
                     }           
                     CComQIPtr<IHTMLDocument2> pDoc(pContainer);
                     if(!pDoc)
                     {
                            return;
                     }
                     CComPtr<IDispatch> pScript;
                     pDoc->get_Script((IDispatch**) &pScript);
                     if(FAILED(hr))
                     {
                            return;
                     }
                     CComBSTR bstrMember(funcName); //传入JS的函数名
                     DISPID dispid;
                     hr = pScript->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
                     if(FAILED(hr))
                     {
                            return;
                     }
                     EXCEPINFO excepInfo;
                     memset(&excepInfo, 0, sizeof(excepInfo));
                     CComVariant vaResult;
                     UINT nArgErr = (UINT)-1; // initialize to invalid arg
                     hr = pScript->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr);
              }
       }
}
1.1.3   为CDemoDialog的按钮增加事件
DISPPARAMS dispparams;
       memset(&dispparams, 0, sizeof(dispparams));
       dispparams.cArgs=2;   // 设置参数个数
       dispparams.rgvarg=new VARIANTARG[2]; // 初始化参数数组
       dispparams.rgvarg[0].vt=VT_BSTR; // 第一个参数的类型
       dispparams.rgvarg[0].bstrVal=::SysAllocString(L"One Dream"); //第一个参数的值
 
       dispparams.rgvarg[1].vt=VT_BSTR;   //第二个参数的类型
       dispparams.rgvarg[1].bstrVal=::SysAllocString(L"One World "); //第二个参数的值
       CalJSFunction("testFunc",dispparams); // testFunc是要调用JS的函数名
 
       SysFreeString(dispparams.rgvarg[0].bstrVal);
       SysFreeString(dispparams.rgvarg[1].bstrVal);
posted @ 2011-01-27 01:14  alex618  阅读(1156)  评论(0编辑  收藏  举报