我想用VC++写一段网页操作的程序,但不成功。同志们能不能帮我分析一下问题,理清一下编程思路。
我在一个网页上希望完成这样的任务:首先,我想在对话框中用一个Microsoft Web Browser控件打开一个网页,在上面获得一些链接。然后,将这些依次在另一个Microsoft Web Browser控件上,依次打开这些链接进行一些表单操作。
问题是:我在第一个控件上的DownloadCompleteExplorer1()函数使用Navigate()函数,想在第二个控件上依次打开链接的网页,在DownloadCompleteExplorer2()函数中进行相关操作。但是实际上每次运行都只能打开最后一个链接。也就是说,使用Navigate()函数后,并不等待第二个控件的DownloadComplete事件执行,就继续第一个控件DownloadCompleteExplorer1()的下一条语句。(我想第一个控件的DownloadCompleteExplorer1()没执行完,是不会执行第二个控件的DownloadCompleteExplorer2()函数的。)怎样解决上面的问题呢?我想可能需要用多线程,但是多线程我正在学习中,同志们能给些解决办法吗?最好有例程。
不胜感激!
VC++怎样进行多网页操作?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-25 16:48关注
该回答引用ChatGPT
您的问题可能是因为在第一个WebBrowser控件的DownloadComplete事件处理函数中,使用了异步方式Navigate到链接页面,导致第二个WebBrowser控件的DownloadComplete事件处理函数在第一个WebBrowser控件的DownloadComplete事件处理函数之前触发,从而导致第二个WebBrowser控件只打开最后一个链接页面。
为了解决这个问题,您可以考虑使用同步方式Navigate到链接页面,即在第一个WebBrowser控件的DownloadComplete事件处理函数中,在调用第二个WebBrowser控件的Navigate函数之前,先等待第一个WebBrowser控件的Navigate完成。您可以使用WebBrowser控件的ReadyState属性来判断页面是否已经加载完毕,当ReadyState属性为READYSTATE_COMPLETE时,表示页面已经加载完成。
以下是示例代码,供您参考:
// 定义成员变量 CStringArray m_links; // 存储链接 int m_currentLinkIndex; // 当前链接索引 // 第一个WebBrowser控件的DownloadComplete事件处理函数 void CMyDialog::DownloadCompleteExplorer1() { // 获取链接 IHTMLDocument2Ptr spDoc = m_webBrowser1.GetDocument(); IHTMLElementCollectionPtr spLinks = spDoc->links; long linksCount = spLinks->length; for (long i = 0; i < linksCount; i++) { IHTMLElementPtr spLink = spLinks->item(i); CString link = spLink->getAttribute(_T("href"), 0); m_links.Add(link); } // 依次打开链接 m_currentLinkIndex = 0; NavigateToNextLink(); } // 第二个WebBrowser控件的DownloadComplete事件处理函数 void CMyDialog::DownloadCompleteExplorer2() { // 在页面加载完毕后执行相关操作 // ... // 继续打开下一个链接 m_currentLinkIndex++; NavigateToNextLink(); } // 导航到下一个链接 void CMyDialog::NavigateToNextLink() { if (m_currentLinkIndex < m_links.GetCount()) { // 等待第一个WebBrowser控件的Navigate完成 while (m_webBrowser1.get_ReadyState() != READYSTATE_COMPLETE) { Sleep(100); } // 在第二个WebBrowser控件中打开链接 CString link = m_links[m_currentLinkIndex]; m_webBrowser2.Navigate(link, NULL, NULL, NULL, NULL); } }
在上面的示例代码中,我们使用了一个CStringArray类型的成员变量m_links来存储链接,使用一个整型成员变量m_currentLinkIndex来表示当前链接的索引。在第一个WebBrowser控件的DownloadComplete事件处理函数中,我们先获取链接,并将它们存储到m_links数组中,然后设置m_currentLinkIndex为0,调用NavigateToNextLink函数来依次打开链接。
在NavigateToNextLink函数中,我们首先判断当前链接的索引是否小于链接数组的长度,如果是,就等待第一个WebBrowser控件的Navigate完成,然后在第二个WebBrowser控件中打开链接。如果当前链接的索引已经等于链接数组的长度,就表示所有链接已经打开完成,函数执行结束。
通过上述方式,我们可以确保在第一个WebBrowser控件的Navigate完成之后才会调用第二个WebBrowser控件的Navigate函数,从而避免了第二个WebBrowser控件只打开最后一个链接页面的问题。
需要注意的是,上述代码中使用了一个简单的等待方式来等待第一个WebBrowser控件的Navigate完成,这样会造成CPU的浪费。更好的方式是使用事件通知机制来通知第二个WebBrowser控件,第一个WebBrowser控件的Navigate已经完成,可以打开下一个链接了。如果您已经熟悉了多线程编程,可以使用多线程来实现这个功能。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 #MATLAB仿真#车辆换道路径规划
- ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
- ¥15 数据可视化Python
- ¥15 要给毕业设计添加扫码登录的功能!!有偿
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条
- ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘