由于一些特殊的业务场景,用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);