在事件DownloadComplete上访问HTML源代码

Accessing HTML source on event DownloadComplete?

本文关键字:HTML 源代码 访问 事件 DownloadComplete      更新时间:2023-10-16

我正在研究一个广告/弹出窗口拦截器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 ?

错误的事件,你可以在DocumentComplete上"play" dom,而不是DownloadComplete。

我还建议你使用CComPtr,这样你就不需要在每个接口上调用release()