• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 关于activex控件,嵌入页面得activex控件有没有办法与调用控件的页面通讯

关于activex控件,嵌入页面得activex控件有没有办法与调用控件的页面通讯

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了 关于activex控件,嵌入页面得activex控件有没有办法与调用控件的页面通讯等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于activex控件, 嵌入页面得activex控件有没有办法与调用控件的页面通讯
描述:

问一个嵌入html的activex控件的问题:
当activex完成任务后, 希望能通过某种方式通告给调用控件的页面, 以便页面自动刷新
当前做的代码是一个mfc activex控件, 请问有这种机制吗


解决方案1:

html:
<object classid="clsid:C0F1EDF0-34C3-4300-A322-4B94CCE40B85" id="XXXBrowser" 
codebase="http://notebook/Test/XXXBrowser.cab" width=100% height=100%>
 
  <param name="_ExtentY" value="20320">
  <param name="_StockProps" value="0">
  
</object>
</p>
<script language=JScript for=XXXBrowser event="Logs(iType,strInfo)">
alert(iType);
alert(strInfo);
</script>
Logs(iType,strInfo)为ActiveX控件定义的Automation事件。

解决方案2:

有啊,给你代码 
CString CXXXCtrl::PageInterface(long lParam1, long lParam2, long lParam3, const CString& strParam)
{
HRESULT hr = E_FAIL;
CComPtr<IOleObject> pOleObject = 0;
CComPtr<IOleClientSite> pClientSite = 0;
CComPtr<IWebBrowser2> m_spBrowser = 0;
CComPtr<IHTMLDocument2> m_spDoc = 0;
CComPtr<IDispatch> pscript;
IUnknown *iUn;
iUn = GetControllingUnknown();
hr = iUn->QueryInterface(IID_IOleObject, reinterpret_cast<void **> (&pOleObject));
if (FAILED(hr))
{
AfxMessageBox("pOleObject");
return "-1";
}
IServiceProvider *isp, *isp2 = NULL;
hr = pOleObject->GetClientSite(&pClientSite);
if (!pClientSite)
{
AfxMessageBox("pClientSite");
return "-1";
}
else
{
try
{
hr = pClientSite->QueryInterface(IID_IServiceProvider, reinterpret_cast<void **>  (&isp));
if (FAILED(hr))
{
AfxMessageBox("IID_IServiceProvider");
return "-1";
}
hr = isp->QueryService(SID_STopLevelBrowser, IID_IServiceProvider, reinterpret_cast<void **>(&isp2));
if (FAILED(hr))
{
AfxMessageBox("SID_STopLevelBrowser");
return "-1";
}
hr = isp2->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, reinterpret_cast<void **>(&m_spBrowser));  
if (FAILED(hr))
{
AfxMessageBox("SID_SWebBrowserApp");
return "-1";
}
hr = m_spBrowser->get_Document((IDispatch**)&m_spDoc);  
if(FAILED(hr))
{
AfxMessageBox("get_Document");
return "-1";
}
}
catch(LPCTSTR lpszErr)  
{  
if(CString(lpszErr)!="")  
AfxMessageBox(lpszErr);  
return "-1";
}
catch(...)
{
AfxMessageBox("未知错误");
return "-1";
}
isp->Release();
isp2->Release();
}
hr = m_spDoc->get_Script(&pscript);
if(FAILED(hr))
{
AfxMessageBox("get_Script");
return "-1";
}
CComBSTR bstrMember("PageInterface");//这里得到页面的方法
DISPID dispid;
hr = pscript->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid); 
if(FAILED(hr))
{
AfxMessageBox("GetIDsOfNames");
return "-1";
}
DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams);
dispparams.cArgs = 4;
dispparams.rgvarg = new VARIANT[dispparams.cArgs];
for(int i=0; i<3; i++)
dispparams.rgvarg[i].vt = VT_I4;
dispparams.rgvarg[0].lVal = lParam1;
dispparams.rgvarg[1].lVal = lParam2;
dispparams.rgvarg[2].lVal = lParam3;
dispparams.rgvarg[3].vt = VT_BSTR;
dispparams.rgvarg[i].bstrVal = strParam.AllocSysString();
dispparams.cNamedArgs = 0;
EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);
_variant_t Var;
Var.Clear();
CComVariant varesult;
UINT nArgErr = (UINT)-1;
hr = pscript->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparams, &varesult, &excepInfo, &nArgErr);//调用 页面方法
delete []dispparams.rgvarg;
if (FAILED(hr))
{
CString strMSG;
strMSG.Format("调用脚本函数出错[%d]!\n\nlParam1 = %d,lParam2 = %d,lParam3 = %d, strParam = %s", GetLastError(), lParam1, lParam2, lParam3, strParam);
AfxMessageBox(strMSG);
return "-1";
}
else
{
CString Result;
if (varesult.vt != VT_EMPTY)
{
Result = varesult.bstrVal;
}
else
{
Result = "1";
}
return Result;
}
}
上面这个页面的方法要在顶层页面定义

解决方案3:

可以用VBScript或者JavaScript实现,在ActiveX中设定一个事件,当ActiveX完成任务后
Fire这个事件,在VBScript中可以刷新页面,差不多就是这样:
<SCRIPT FOR=MyActiveX1 EVENT=ParameterLoaded()>
<!-- {
   window.document.write("The parameter you entered is:<br> " 
                         + MyActiveX1.OutputParameter + "  ")
-->
</SCRIPT>

解决方案4:

本来事件是比较理想的方法,不过网页中对事件的处理是比较弱的.可以在active中再提供一个接口,在web循环调用,直到这个方法返回值为真时刷新页面


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于activex控件,atl,stl,com,模板等等概念,以及他们之间的联系??
  • 关于activex控件,嵌入页面得activex控件有没有办法与调用控件的页面通讯

相关文章

  • 2017-06-04 关于VC中的DXFReader控件?
  • 2017-06-04 mschart柱状图,如何在x轴上显示ColumnLabel,同时改变颜色
  • 2017-06-05 请问如何可以获得一个VC项目或WindowsEXE程序占用的全局变量的清单
  • 2017-06-05 单文档应用程序IDispEventImpl
  • 2017-06-05 如何将电脑的可用串口显示出来
  • 2017-06-04 紧急求助我用ATL编的自动化组件只有VC能读这是为啥
  • 2017-06-05 高手来指点一下,谢谢
  • 2017-06-05 为什么??:在一个类函数里启动一个线程,并用另一个成员函数作为线程函数,出错了
  • 2017-06-04 如何为explorer编写组件,哪能找到接口标准,详见下
  • 2017-06-05 vc文件打包

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ATL属性页的问题
    • 大家进来看看吧来者有分
    • 怎样把Windows2000的COM+10升级为COM+20?在那里下载什么安装包呢?
    • 怎么在ATL中动态创建有界面的控件?
    • 怎么强行结束进程?
    • 如何看每个线程的状态
    • 如何同时用几个线程打开操作一个文件??
    • 怎么作才能使一个win32staticLibrary中的一个函数返回多个变量值
    • 关于响应自定义控件的鼠标的消息问题
    • 大家来分析一下这种异常的进程状态

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有