在事件 DownloadComplete 上访问 HTML 源代码?

发布于 2024-12-14 15:54:35 字数 1601 浏览 3 评论 0原文

我正在开发广告/弹出窗口拦截器 BHO,并且我正在尝试从事件“downloadcomplete”访问网站的 html,因此我可以过滤所有广告和恶意 uri。

我的代码如下所示:

case DISPID_DOWNLOADCOMPLETE:
    {
        if(iBrowser) //IWebBrowser2*
        {
            HRESULT hr;
            IUnknown *pUnkBrowser = NULL;   

            hr = iBrowser->QueryInterface(IID_IUnknown, (void**)&pUnkBrowser);

            if( SUCCEEDED(hr) && pUnkBrowser!=NULL)
            {
                if( SUCCEEDED(hr) )
                {
                    IDispatch* pHtmlDocDispatch = NULL;

                    IHTMLDocument2 * pHtmlDoc = NULL;

                    hr = iBrowser->get_Document (&pHtmlDocDispatch);

                    if (SUCCEEDED (hr) && (pHtmlDocDispatch != NULL))
                    {
                        hr = pHtmlDocDispatch->QueryInterface (IID_IHTMLDocument2,  (void**)&pHtmlDoc);

                        if (SUCCEEDED (hr) && (pHtmlDoc != NULL))
                        {
                            IHTMLElement *pBody = 0;

                            pHtmlDoc->get_body( &pBody );
                            // I want to get the html here and filter out the ads but pBody is always null

                            if(pHtmlDoc) pHtmlDoc->Release();

                        }

                        if(pHtmlDocDispatch) pHtmlDocDispatch->Release();
                    }
                }

                if(pUnkBrowser) pUnkBrowser->Release();
            }
        }
        return S_OK;
    }
    break;

如何从该事件访问和修改 html?

I am working on a ads/popup blocker BHO and I am trying to access the html of a website from the event "downloadcomplete", so I can filter all the ads and malicious uris.

My code looks something like this:

case DISPID_DOWNLOADCOMPLETE:
    {
        if(iBrowser) //IWebBrowser2*
        {
            HRESULT hr;
            IUnknown *pUnkBrowser = NULL;   

            hr = iBrowser->QueryInterface(IID_IUnknown, (void**)&pUnkBrowser);

            if( SUCCEEDED(hr) && pUnkBrowser!=NULL)
            {
                if( SUCCEEDED(hr) )
                {
                    IDispatch* pHtmlDocDispatch = NULL;

                    IHTMLDocument2 * pHtmlDoc = NULL;

                    hr = iBrowser->get_Document (&pHtmlDocDispatch);

                    if (SUCCEEDED (hr) && (pHtmlDocDispatch != NULL))
                    {
                        hr = pHtmlDocDispatch->QueryInterface (IID_IHTMLDocument2,  (void**)&pHtmlDoc);

                        if (SUCCEEDED (hr) && (pHtmlDoc != NULL))
                        {
                            IHTMLElement *pBody = 0;

                            pHtmlDoc->get_body( &pBody );
                            // I want to get the html here and filter out the ads but pBody is always null

                            if(pHtmlDoc) pHtmlDoc->Release();

                        }

                        if(pHtmlDocDispatch) pHtmlDocDispatch->Release();
                    }
                }

                if(pUnkBrowser) pUnkBrowser->Release();
            }
        }
        return S_OK;
    }
    break;

How could I access and modify the html from this event?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

思念绕指尖 2024-12-21 15:54:35

错误的事件,您可以在 DocumentComplete 上“玩”dom,而不是在 DownloadComplete 上。

另外我建议您使用 CComPtr,这样您就不需要在每个接口上调用release()。

Wrong event, you can "play" with the dom on the DocumentComplete, not the DownloadComplete.

Also I would advise you to use CComPtr, that way you don't need to call the release() on every interface.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文