在网上搜索了好久,有关浏览器控制方面的资料的确有限,只好求助于msdn 了。
我想在 Invoke()中处理  DISPID_DOWNLOADCOMPLETE 消息,对应的处理函数是DocumentComplete(LPDISPATCH pDisp, VARIANT* URL),我想在该函数中得到网页的源代码,在 msdn 中 WebBrowser Control 篇中有这么一个 sample:void CMyClass::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
{
    HRESULT hr;
    IUnknown* pUnkBrowser = NULL;
    IUnknown* pUnkDisp = NULL;
    IDispatch* pDocDisp = NULL;
    IHTMLDocument2* pDoc = NULL;    // Is this the DocumentComplete event for the top frame window?
    // Check COM identity: compare IUnknown interface pointers.
    hr = m_pBrowser->QueryInterface(IID_IUnknown, (void**)&pUnkBrowser);    if (SUCCEEDED(hr))
    {
        hr = pDisp->QueryInterface(IID_IUnknown, (void**)&pUnkDisp);        if (SUCCEEDED(hr))
        {
            if (pUnkBrowser == pUnkDisp)
            {
                // This is the DocumentComplete event for the top frame.
                // This page is loaded, so we can access the DHTML Object Model.
                hr = m_pBrowser->get_Document(&pDocDisp);                if (SUCCEEDED(hr))
                {
                    // Obtained the document object.
                    pDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc);
                    if (SUCCEEDED(hr))
                    {
                        // Obtained the IHTMLDocument2 interface for the document object
                        ProcessDocument(pDoc);
                    }                    pDocDisp->Release();
                }
            }            pUnkDisp->Release();
        }        pUnkBrowser->Release();
    }
}
     我的问题是处理 DISPID_DOWNLOADCOMPLETE 消息时我该怎样传递 
  DocumentComplete(LPDISPATCH pDisp, VARIANT* URL) 的第一个参数,我试过
  给它传递 this 指针,结果根本得不到 pUnkBrowser == pUnkDisp。
  到底该如何传递这个参数,还望各位仁兄指点!不胜感激!

解决方案 »

  1.   

    i use BHO implement it,this is my code
    STDMETHODIMP CSpyIE::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pvarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    USES_CONVERSION;
    if(pDispParams==NULL)
    return E_INVALIDARG;
    switch(dispidMember)
    {
                 case DISPID_NAVIGATECOMPLETE2:
    {
    IDispatch*pDisp=NULL;
    HRESULT hr = m_pWebBrowser2->QueryInterface(IID_IDispatch, (void**)&pDisp);
    _ASSERT(SUCCEEDED(hr));
    if (pDispParams->rgvarg[1].pdispVal == pDisp )
    {
    m_Disp=pDisp;
    }
    }
    break;
    // The parameters for this DISPID:
    // [0]: URL navigated to - VT_BYREF|VT_VARIANT
    // [1]: An object that evaluates to the top-level or frame
    //      WebBrowser object corresponding to the event.
    case DISPID_DOCUMENTCOMPLETE:
    if (pDispParams->rgvarg[1].pdispVal == m_Disp )
    {
                                    ...
                                }
             }
    }
    //for more details ,see MSDN example :IEHelper
      

  2.   

    我想问一下象下面各个 DISPID 的参数如何找,我只是在 msdn的例子里看到过,还是
    只有有限的几个相关参数  
                      // The parameters for this DISPID:
    // [0]: URL navigated to - VT_BYREF|VT_VARIANT
    // [1]: An object that evaluates to the top-level or frame
    //      WebBrowser object corresponding to the event.
      

  3.   

    感谢 kingzai(感悟中)给我的回复,关于参数的问题我在 MSDN 中已经找到了比较详细的解答,
    感谢指点。
      另外,是否有时间回答我的另外一个问题: 我想控制浏览器的下载( WebBrowser Control ),即在 IDispatch::Invoke()
    中处理 DISPID_AMBIENT_DLCONTROL 消息,msdn 中相关代码:STDMETHODIMP CAtlBrCon::Invoke(DISPID dispidMember, REFIID riid,
                                   LCID lcid, WORD wFlags, 
                                   DISPPARAMS* pDispParams,
                                   VARIANT* pvarResult, 
                                   EXCEPINFO* pExcepInfo,
                                   UINT* puArgErr)
    {
        switch (dispidMember)
        {
        case DISPID_AMBIENT_DLCONTROL:
            pvarResult->vt = VT_I4;
            pvarResult->lVal = DLCTL_DLIMAGES | DLCTL_VIDEOS | DLCTL_NO_SCRIPTS;
            break;    default:
            return DISP_E_MEMBERNOTFOUND;
        }    return S_OK;
    }   问题是我在我的程序中加入上述代码后调试发现根本就没有DISPID_AMBIENT_DLCONTROL 消息出现,我的程序根本就不会运行对应的处理代码。
    ????!!!!! 的确是不明白,我已经加过了头文件 mshtmhst.h!