bill168 2013-10-04 05:21 采纳率: 0%
浏览 1031

VC++怎样进行多网页操作?

我想用VC++写一段网页操作的程序,但不成功。同志们能不能帮我分析一下问题,理清一下编程思路。
我在一个网页上希望完成这样的任务:首先,我想在对话框中用一个Microsoft Web Browser控件打开一个网页,在上面获得一些链接。然后,将这些依次在另一个Microsoft Web Browser控件上,依次打开这些链接进行一些表单操作。
问题是:我在第一个控件上的DownloadCompleteExplorer1()函数使用Navigate()函数,想在第二个控件上依次打开链接的网页,在DownloadCompleteExplorer2()函数中进行相关操作。但是实际上每次运行都只能打开最后一个链接。也就是说,使用Navigate()函数后,并不等待第二个控件的DownloadComplete事件执行,就继续第一个控件DownloadCompleteExplorer1()的下一条语句。(我想第一个控件的DownloadCompleteExplorer1()没执行完,是不会执行第二个控件的DownloadCompleteExplorer2()函数的。)怎样解决上面的问题呢?我想可能需要用多线程,但是多线程我正在学习中,同志们能给些解决办法吗?最好有例程。
不胜感激!

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-25 16:49
    关注

    该回答引用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 为什么eprime输出的数据会有缺失?
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题