VC++开发的ActiveX如何通过JavaScript脚本和EOS应用交互
2013-10-30 23:44
776 查看
由于一些特殊的业务场景,用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);
需要包含CWebPage。
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);
需要包含CWebPage。
相关文章推荐
- VC++开发的ActiveX如何通过JavaScript脚本和EOS应用交互
- JavaScript脚本如何访问VC++开发的ActiveX中的方法
- VC++开发的ActiveX如何加入安全机制,避免IE中提示“在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗?”
- VC++开发的ActiveX如何加入安全机制,避免IE中提示“在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗?”
- VC与JavaScript交互(一) ———— 如何实现
- VC调用 JavaScript 难题:如何使当前程序的对象进入脚本
- VC调用 JavaScript 难题:如何使当前程序的对象进入脚本
- VC与JavaScript交互(一) ———— 如何实现
- VC与JavaScript交互(一) ———— 如何实现
- 一步一步实现ATL开发的ActiveX组件与javascript的交互(一)
- VC与JavaScript交互(一) ———— 如何实现
- PhoneGap应用开发对策:如何通过苹果审核?
- PhoneGap应用开发对策:如何通过苹果审核?
- 通过VC开发MySQL数据库应用软件
- Dom元素基本操作方法API,先记录下,方便以后使用。 W3C DOM和JavaScript很容易混淆不清。DOM是面向HTML和XML文档的API,为文档提供了结构化表示,并定义了如何通过脚本
- 如何通过itunes和ios应用底下的沙盒进行共享交互
- 在vc.net下,如何配置OpenOffice的SDK进行应用开发
- VC开发的ActiveX加入安全机制,避免IE中提示“在此页上的ActiveX控件,,不安全,你想允许这种交互吗?”
- EOS非Portal模式下,如何开发一个用户登录验证程序,用户只有在登录验证通过后,方可访问系统。
- vb开发的activex 与javascript 交互