★★★救急了!!!VC 6.0 HtmlView打开网页失败,BeforeNavigate执行后没进入NavigateComplete,会执行什么函数吗?为什么?

52001314 2003-10-28 10:40:01


我的程序除了主线程,还有一个工作线程.

工作线程通知主线程显示页面(CHtmlview->Navigate2),等到页面打开后,再取页面上的数据,执行后续的操作.


问题在于:CMyHtmlView中,有时候打开网页失败,没有执行NavigateComplete事件 .而我在OnNavigateComplete2(LPCTSTR strURL)函数中置了一个变量,如果变量值改变工作线程才继续往下执行.所以,如果打开页面失败,就无法往下执行.

我打开的页面是本机的页面,打开前还判断文件是否存在.但是为什么会打开失败呢?

但是我调试的时候,发现执行函数如下:

OnBeforeNavigate2()
DownloadBegin()
DownloadComplete()
DownloadBegin()
-------------------出错的时候,执行到这就不往下执行了.
OnTitleChange
NavigateComplete()
DownloadComplete()
OnTitleChange
DocumentComplete()


如果DownloadBegin()后,不执行DownloadComplete,程序会执行什么函数?我应该在哪里判断打开失败了(vc6.0).而且一直想不通为什么会download失败.

不是每次都出错,一天左右会出一次.所以不好调试.我把调试信息都写入文件才发现哪些函数没执行的.
...全文
225 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
52001314 2003-11-14
  • 打赏
  • 举报
回复
问题终于解决了.搞了n天,郁闷ing ......


最终发现和程序没有关系.网页中的flash太占资源了.

我的笔记本是256M的,所以测试的时候没有问题.但是运行机是128M的,所以运行的时候就会出现网页打不开的现象.而且我本机的flash插件是上网的时候连上macromedia.com装的.而在运行机上装的下载的一个exe,用那个解析比较耗资源.换成macromedia的flash.ocx后,打不开网页的现象减少了.把内存加到256M就基本没问题了.如果把网页中的flash全部去掉,就一点问题都没有了.

最简单的测试就是拿一个htmlview的程序,写一个while
{
Navigate(....);
Navigate(....);
}

打开的网页带几个flash,如果内存小点,跑上一会儿程序就打不开新的网页了.

哎...
蒋晟 2003-10-30
  • 打赏
  • 举报
回复
use Events
see WalkAll Sample in MSDN
蒋晟 2003-10-30
  • 打赏
  • 举报
回复
strsafe.h is included in Platform SDK
go to http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ to get the lastest SDK
52001314 2003-10-30
  • 打赏
  • 举报
回复
从msdn上下载了WalkAll,编译不过.
缺少strsafe.h
52001314 2003-10-29
  • 打赏
  • 举报
回复
什么情况下会造成网页无法打开?


如果出现这种情况的时候,这个线程是否已经死了?

如果我发现长时间没有进入NavigateComplete,再向HtmlView 发送一个Navigate2(...)会不会没有响应?
52001314 2003-10-29
  • 打赏
  • 举报
回复
我的流程大致如下

工作线程:

funcA()
{
......
标志设为0;
m_pMyHtmlView->Navigate2(......);
while(标志不为1)
{

Sleep(100);
}

}

CMyHtmlView类:
void CMyHtmlView::OnNavigateComplete2(LPCTSTR strURL)
{
....
标志设为1;
....
}

因为OnNavigateComplete2没有执行,所以上面的while就跳不出来了.

原来做的测试不够,没有发现即使打开本机的网页,也会没进入OnNavigateCompelte.

不知道还有谁遇到过这种情况.

大家帮想想有什么解决方法.
52001314 2003-10-29
  • 打赏
  • 举报
回复
感谢楼上的对我的问题的关注.

to microran2000

我不是做自己的浏览器.我只是把html当作自己的显示界面.因为程序中界面比较多,自己做又不美观.所以都用html页面来当界面.

正如您所说,我也是只关心OnBeforeNavigate和DocumentComplete.因为DocumentComplete后才能取到html页面上的元素.但是程序就是不执行DocumentComplete.所以我才调试看执行到哪里了.

和内存泄漏没有关系.因为出错有随机性.有时候一运行没多久就不行了.这时候即使泄漏也没多大影响.HtmlView用Navigate才会泄漏,我用的是Navigate2,好像没发现泄漏问题.

和具体的URL没有关系.因为同一个网页大多数时候打得开,有时候打不开.


to skt32
DownloadComplete Occurs when a navigation operation finishes, is halted, or fails.
Note that any DownloadBegin event will have a corresponding DownloadComplete event.
就是说DownloadBegin后,不管是否成功,DownloadComplete一定会执行.NavigateComplete是在成功后才执行.

我不清楚为什么会没有执行downloadComplete?

to newkey007
应该不是网络问题,我打开的网页是本机的.
天限天空 2003-10-29
  • 打赏
  • 举报
回复
很可能是网络问题

你直接用 IE下载的时候, 也会出现这个问题

Skt32 2003-10-29
  • 打赏
  • 举报
回复
DownloadBegin Occurs when a navigation operation is beginning.
DownloadComplete Occurs when a navigation operation finishes, is halted, or fails.

估计失败是因为有什么杀毒软件例如NORTON ANTIVIRUS 等,把你的文件锁住了。

参考:
Using the WebBrowser control, simplified.
By Gary R. Wheeler

The SimpleBrowser class makes using the WebBrowser control easier in your MFC applications.

http://www.thecodeproject.com/miscctrl/simplebrowserformfc.asp
Skt32 2003-10-29
  • 打赏
  • 举报
回复
DownloadComplete Event

--------------------------------------------------------------------------------

Occurs when a navigation operation finishes, is halted, or fails.

Syntax

Private Sub object_DownloadComplete

Parameters

object
Object expression that evaluates to an object in the Applies To list.
Remarks

Unlike NavigateComplete2, which is fired only when a URL is successfully navigated to, this event is always fired after a navigation starts. Any animation or "busy" indication that the container needs to display should be connected to this event. Note that any DownloadBegin event will have a corresponding DownloadComplete event.

Applies To

InternetExplorer, WebBrowser
See Also

Navigate, Navigate2, ProgressChange
52001314 2003-10-29
  • 打赏
  • 举报
回复
DownloadBegin()后就没响应了.这个线程好像死了.怎么再叫它Navigate2,都不会响应了.

这下子头大了:((
ndy_w 2003-10-29
  • 打赏
  • 举报
回复
建议:IWebBrowser2::get_ReadyState看看。
microran2000 2003-10-28
  • 打赏
  • 举报
回复
首先我猜想你可能是在制作一个自己的浏览器,在提出自己的看法之前,我建议你从网上下载一个MyIE2(MyBrowser)的源程序代码,这些代码是基于IE内核实现的,里面实现IE诸多COM接口事件的连接点(即上面你提到的几个回调函数)。我想通过源代码你肯定会有所获。
得到代码后,你不必通读代码,只需从项目中搜索你感兴趣的几个关键字即可。比如上面几个事件,这样你很容易定位到你需要的代码。
我不知道你提到的问题是否和具体的URL有关,因为它是有时出现,有时不出现。比如某个URL连接存在脚本错误,这些脚本间接地影响了你的程序。你不妨在这些事件中通过try/catch添加SEH处理。并记录出错时的URL,然后对该URL进行重点调试。另外你的程序不知道是否存在内存泄漏等情况,比如组件接口的引用记数错误忘了Release或者BSTR分配的内存没有释放,这些情况累计到一定程度,都会产生问题。
因为在处理上述事件时,你不可避免要和IWebBrowser2 IHTMLDocument2 IHTMLElement等等接口打交道,在获得这些指针的时候并非每次都会成功,不知你是否对调用的结果都进行了容错检查比如if(SUCCEEDED(hr) && m_spWebBrowser2)
说实在的,我对于中间发生的事件,并没有太注意过,我只关心两头,OnBeforeNavigate2()、DocumentComplete()刚刚开始或者完全结束。如果需要中间可以重载Progress事件。
没有见你的部分代码,很多东西理不清,替你顶一下吧!
microran2000 2003-10-28
  • 打赏
  • 举报
回复
help u up!

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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