---***ActiveX控件调用JS函数***---

luyangcplusplus 2010-01-15 10:01:03
各位大虾,小弟用MFC做了一个ActiveX控件,控件嵌入到JSP页面里使用。

在控件里调用JS函数,但是现在问题是只能调用没有参数的JS函数。

请问怎么样可以调用带参数的JS函数,让ActiveX把参数传递给JS?

请各位大侠不吝赐教,不胜感激!
...全文
436 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aye_Love 2012-01-10
  • 打赏
  • 举报
回复
我去,解决了要贴出来呀!!!
雪影 2010-01-15
  • 打赏
  • 举报
回复
1.获取js函数接口
可以在COM组件中定义一个属性用于获取js函数接口.
.IDL
IXXInterface:IDispatch{
[propput, id(4), helpstring("property funDispatch")] HRESULT funDispatch([in] IDispatch* newVal);
}


.h
CComPtr<IDispatch>		m_pDispatch;

.cpp
   STDMETHODIMP CXXX::put_funDispatch(IDispatch* newVal)
{
m_pDispatch = newVal;
}

调用js函数
.cpp
   HRESULT CXXX::FireJsFunctionk(){
CComVariant varResult;
//在这里封装要想传递的参数
CComVariant avarParams[2];
avarParams[0].lVal = 1; //参数1
avarParams[0].vt = VT_UI4;
VARIANT Data;
//对Data赋值
avarParams[1] = Data; //参数2
DISPPARAMS params = {avarParams, NULL, 2, 0 };

HRESULT hr = 0;
if(m_pDispatch )
hr = m_pDispatch->Invoke(0,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,
¶ms, &varResult, NULL, NULL);

return hr;
}
雪影 2010-01-15
  • 打赏
  • 举报
回复
1.获取js函数接口
可以在COM组件中定义一个属性用于获取js函数接口.
.IDL
IXXInterface:IDispatch{
[propput, id(4), helpstring("property funDispatch")] HRESULT funDispatch([in] IDispatch* newVal);
}

.h
CComPtr<IDispatch> m_pDispatch;
.cpp
STDMETHODIMP CXXX::put_funDispatch(IDispatch* newVal)
{
m_pDispatch = newVal;
}
调用js函数
.cpp
HRESULT CXXX::FireJsFunctionk(){
CComVariant varResult;
//在这里封装要想传递的参数
CComVariant avarParams[2];
avarParams[0].lVal = 1; //参数1
avarParams[0].vt = VT_UI4;
VARIANT Data;
//对Data赋值
avarParams[1] = Data; //参数2
DISPPARAMS params = {avarParams, NULL, 2, 0 };

HRESULT hr = 0;
if(m_pDispatch )
hr = m_pDispatch->Invoke(0,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,
¶ms, &varResult, NULL, NULL);

return hr;
}
luyangcplusplus 2010-01-15
  • 打赏
  • 举报
回复
等待...
oyljerry 2010-01-15
  • 打赏
  • 举报
回复
http://bbs.51cto.com/archiver/tid-419100.html
luyangcplusplus 2010-01-15
  • 打赏
  • 举报
回复
sandyandy,我用了你的方法,但是extern IDispatch *pScript;没有初始化。
sandyandy 2010-01-15
  • 打赏
  • 举报
回复
  //向js发送信息   
LRESULT CFXVTDoc::outputParam(CString fuctionName,const CArray<CString> ¶ms)
{
extern IDispatch *pScript;
if(pScript==NULL){
return -1;
}
CComBSTR bstrMember(fuctionName);

DISPID dispid;

HRESULT hr=pScript->GetIDsOfNames(IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);
if(FAILED(hr)){
#ifdef _DEBUG
switch(hr)
{
case E_OUTOFMEMORY:
MessageBox(NULL,"E_OUTOFMEMORY","outputParam Err",0);
break;
case DISP_E_UNKNOWNNAME:
MessageBox(NULL,"DISP_E_UNKNOWNNAME","outputParam Err",0);
break;
case DISP_E_UNKNOWNLCID:
MessageBox(NULL,"DISP_E_UNKNOWNLCID","outputParam Err",0);
break;
}
#endif
return -1;
}

DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams);

int paramNum=params.GetCount();
VARIANT *pParams=new VARIANT[paramNum];

for( int i = 0; i<paramNum; i++)
{
CComBSTR bstr =params.GetAt(i); // back reading
bstr.CopyTo(&pParams[i].bstrVal);
pParams[i].vt = VT_BSTR;
}

dispparams.rgvarg = pParams;
dispparams.cNamedArgs = 0;
dispparams.cArgs=paramNum;

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);
delete []dispparams.rgvarg;
return 1;
}
wuhuwy 2010-01-15
  • 打赏
  • 举报
回复
帮顶,学习了
luyangcplusplus 2010-01-15
  • 打赏
  • 举报
回复
自己解决了,结贴

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧