• 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 > mshtml一问。

mshtml一问。

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

佚名通过本文主要向大家介绍了mshtml.dll修复,mshtml dll修复工具,mshtml.dll,regsvr32 mshtml.dll,mshtml.dll下载等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: mshtml一问。
描述:

有些时候发现documentcomplete会被多次触发。
msdn里说如果页面含有框架的话就可能这样。
This event's pDisp parameter is the same as the IDispatch interface pointer of the frame in which this event fires. 
In the loading process, the highest level frame (which is not necessarily the top-level frame) fires the final DWebBrowserEvents2::DocumentComplete event. At this time, the pDisp parameter will be the same as the IDispatch interface pointer of the highest level frame. 
它说函数的第一个参数pDisp和the IDispatch interface pointer of the frame in which this event fires是一样的。
最高层的框架会最后产生这个事件,而且它的pDisp和the IDispatch interface pointer of the highest level frame是一样的。
可是在Invoke里加上这段后发现两个指针却是不相等的
case DISPID_BEFORENAVIGATE2:{
m_pDisp=pDispParams->rgvarg[0].pdispVal;
ATLTRACE("m_pDisp=0x%x\n",m_pDisp);
}
case DISPID_DOCUMENTCOMPLETE:
{
IDispatch* pDisp;
IHTMLDocument2 *pDoc;
m_pWebBrowser2->get_Document(&pDisp);
IDispatch *pCurDisp=pDispParams->rgvarg[0].pdispVal;
ATLTRACE("0x%x,0x%x\n",m_pDisp,pCurDisp);
if(pCurDisp==m_pDisp) //if(pDisp==pCurDisp)
ATLTRACE("equal\n");
else
ATLTRACE("not equal\n");
break;
}
看起来应该是上面这段代码有问题。应该如何改呢?


解决方案1:

不是只因为 页面含有框架 会多次 documentcomplete
你连接点多次,也会多次调用 documentcomplete

解决方案2:

//处理navigate complete,查阅相关KB 如何判断文档下载完成
STDMETHODIMP CSpyIEEx::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
                                DISPPARAMS* pDispParams, VARIANT* pvarResult,
                                EXCEPINFO*  pExcepInfo,  UINT* puArgErr)
// Through this dispatch interface, we'll receive all browser events
// Event arguments are listed before each case statement
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!pDispParams)
return E_INVALIDARG;
CComPtr<IDispatch> spDisp;
HRESULT hr;
switch (dispidMember)
{
// [0]: Cancel flag  - VT_BYREF|VT_BOOL
// [1]: HTTP headers - VT_BYREF|VT_VARIANT
// [2]: Address of HTTP POST data  - VT_BYREF|VT_VARIANT 
// [3]: Target frame name - VT_BYREF|VT_VARIANT 
// [4]: Option flags - VT_BYREF|VT_VARIANT
// [5]: URL to navigate to - VT_BYREF|VT_VARIANT
// [6]: An object that evaluates to the top-level or frame
//      WebBrowser object corresponding to the event. 
//
//监视IE BEFORENAVIGATE2事件
case DISPID_BEFORENAVIGATE2:
{
// Deactivate keyboard hook
IHTMLDocument2* pDoc2=NULL;
m_pDoc2=pDoc2;
}
break;
// [0]: URL navigated to - VT_BYREF|VT_VARIANT
// [1]: An object that evaluates to the top-level or frame
//      WebBrowser object corresponding to the event. 
//
case DISPID_NAVIGATECOMPLETE:
// m_pDisp=pDispParams->rgvarg[0].pdispVal;
break;
// [0]: New status bar text - VT_BSTR
//
/*
case DISPID_STATUSTEXTCHANGE:
break;
*/
// [0]: Maximum progress - VT_I4
// [1]: Amount of total progress - VT_I4
//
/*
case DISPID_PROGRESSCHANGE:
break;
*/
// [0]: Document URL - VT_BYREF|VT_VARIANT
// [1]: An object that evaluates to the top-level or frame
//      WebBrowser object corresponding to the event. 
//
case DISPID_DOCUMENTCOMPLETE:
{
// Temporarily disable keyboard hook
IDispatch*disp= pDispParams->rgvarg[1].pdispVal;
if(m_spWebBrowser2 == disp )
{
// Fill in form if necessary
try
{
// Get the WebBrowser's document object
hr = m_spWebBrowser2->get_Document(&spDisp);
if (SUCCEEDED(hr) && spDisp && m_spWebBrowser2)
{
                                                    ...
                                              }
 ...


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

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

  • 如何把ajax插入的HTML代码也写入文件,用MSHTML
  • 跪求指点:mshtml::IHTMLElement,修改html标签属性
  • mshtml问题
  • MSHTML问题
  • MSHTML高手帮忙
  • MSHTML如何执行脚本?(100,分不够可以开新帖)
  • MSHTML不是WebBrowser如何拦截弹出窗口?
  • mshtml一问。

相关文章

  • 2017-06-04 VC2008ATL新建项目后生成的后面PS的是什么东西有何作用
  • 2017-06-04 图像显示BITMAPINFO结构体初始化问题
  • 2017-06-04 求助,高手指点用VC做控件的问题急在线等
  • 2017-06-04 mfc连接MSSQL服务器SA登录失败
  • 2017-06-04 请教OATHTOTP
  • 2017-06-05 MFC调用C#dll的com组件
  • 2017-06-04 请问directsound能用来播放背景音乐吗?
  • 2017-06-05 使用createprocess启动formatcom格式化遇到的问题
  • 2017-06-05 求助ActiveX控件交互问题
  • 2017-06-05 DLL跨机器使用问题

文章分类

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

最近更新的内容

    • 赚钱怎么赚呀
    • 如何在MFCActiveXControlWizard生成的控件中调用别的控件?
    • 跨套间的com组件调用,什么时候com会自动marshal,什么时候需要手工marshal
    • WinXP+VC6下安装新版PlatformSDK之后编译出错```高分求解
    • 求COM规范文档~
    • 小弟我诚心诚意请教各路高手动态菜单?????
    • 在线程中如果更新对话框?
    • 初学DLL请教
    • 在VC為什么部分函數不能使用
    • 想用atl封装一个控件给VB使用我怎么样才能把vb中的picture控件交给atl重新画图呢?

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

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