我之前用put_innerHTM修改了网页的代码,
然后用get_innerHTML得到的是put_innerHTM修改的代码,直接到IE看源代码是本身的代码,现在想问怎么得到它?

解决方案 »

  1.   

    put_innerHTML是在DocumentComplete后动态更改了网页的显示,而没有修改源码本身。
      

  2.   

    现在用get_innerHTML得不到真正的源码怎么办?
      

  3.   

    确实得不到。ViewSource实际上也是重新下载的。
      

  4.   

    代码是你改的,你可以先获得代码后,然后,把你用put_innerHTML修改的部分,体现到得到的源代码中。获得网页源码:
    http://blog.csdn.net/lion_wing/archive/2006/06/02/769742.aspx
      

  5.   

    我是在网页打开前(DISPID_BEFORENAVIGATE2)改的.
      

  6.   

    //
    // IDispatch Methods
    //
    STDMETHODIMP CYDBrowserHelperObject::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
                                    DISPPARAMS* pDispParams, VARIANT* pvarResult,
                                    EXCEPINFO*  pExcepInfo,  UINT* puArgErr)
    {
       USES_CONVERSION;   if (!pDispParams)
          return E_INVALIDARG;
       
       switch (dispidMember)
       {
          //
          // The parameters for this DISPID are as follows:
          // [0]: Cancel flag  - VT_BYREF|VT_BOOL
          // [1]: HTTP headers - VT_BYREF|VT_VARIANT
          // [2]: Address of HTTP POST data  - VT_BYREF|VT_VARIANT 
          // [3]: Target frame name - VT_BYREF|VT_VARIANT 
          // [4]: Option flags - VT_BYREF|VT_VARIANT
          // [5]: URL to navigate to - VT_BYREF|VT_VARIANT
          // [6]: An object that evaluates to the top-level or frame
          //      WebBrowser object corresponding to the event. 
          //
          case DISPID_BEFORENAVIGATE2:   OnBeforeNavigate2();         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_NAVIGATECOMPLETE2:         break;      //
          // The parameters for this DISPID:
          // [0]: New status bar text - VT_BSTR
          //
          case DISPID_STATUSTEXTCHANGE:
             break;      //
          // The parameters for this DISPID:
          // [0]: Maximum progress - VT_I4
          // [1]: Amount of total progress - VT_I4
          //
          case DISPID_PROGRESSCHANGE:       break;      case DISPID_DOCUMENTCOMPLETE:
        OnDocumentComplete();
            break;      case DISPID_DOWNLOADBEGIN:
             break;      case DISPID_DOWNLOADCOMPLETE:
             break;      //
          // The parameters for this DISPID:
          // [0]: Enabled state - VT_BOOL
          // [1]: Command identifier - VT_I4
          //
          case DISPID_COMMANDSTATECHANGE:
             break;      case DISPID_NEWWINDOW2:       break;      //
          // The parameters for this DISPID:
          // [0]: Document title - VT_BSTR
          //
          case DISPID_TITLECHANGE:
             break;      //
          // The parameters for this DISPID:
          // [0]: Name of property that changed - VT_BSTR
          //
          case DISPID_PROPERTYCHANGE:
             break;      //
          // The parameters for this DISPID:
          // [0]: Address of cancel flag - VT_BYREF|VT_BOOL
          //
          case DISPID_QUIT:
             ::MessageBox(NULL,"",NULL,NULL);///这里好像没有执行
             ManageConnection(Unadvise);
             break;      default:
             break;
       }   return S_OK;
    }
    void CYDBrowserHelperObject::OnBeforeNavigate2(){//这里修改网页代码
    HRESULT hr; CComPtr<IDispatch> spDisp;

    // 取得 IHTMLDocument2 的IDispatch指针
    hr = m_spWebBrowser2->get_Document( &spDisp );
    if( FAILED( hr ) ) return;
    // 取得 IHTMLDocument2 的指针
    CComQIPtr < IHTMLDocument2, &IID_IHTMLDocument2> spDoc( spDisp ); if( spDoc )
    {
    CComPtr < IHTMLElement > spBody;
    hr = spDoc->get_body( &spBody );
    if( FAILED( hr ) ) return; // Get the HTML text
    //CComBSTR bstrHTMLText;
    //hr = spBody->get_innerHTML( &bstrHTMLText );
    //if( FAILED( hr ) ) return;
    //USES_CONVERSION;
    BSTR m_bsStr = _com_util::ConvertStringToBSTR("ffffffffffff<br><br><br>");
    hr = spBody->put_innerHTML(m_bsStr);
    //::MessageBox(NULL,OLE2CT( bstrHTMLText ),NULL,NULL);
    }
    }void CYDBrowserHelperObject::OnDocumentComplete(){//在这里想把网页恢复
    HRESULT hr; CComPtr<IDispatch> spDisp;

    // 取得 IHTMLDocument2 的IDispatch指针
    hr = m_spWebBrowser2->get_Document( &spDisp );
    if( FAILED( hr ) ) return;
    // 取得 IHTMLDocument2 的指针
    CComQIPtr < IHTMLDocument2, &IID_IHTMLDocument2> spDoc( spDisp ); if( spDoc )
    {
    CComPtr < IHTMLElement > spBody;
    hr = spDoc->get_body( &spBody );
    if( FAILED( hr ) ) return; // Get the HTML text
    CComBSTR bstrHTMLText;
    hr = spBody->get_outerHTML( &bstrHTMLText );
    if( FAILED( hr ) ) return;
    USES_CONVERSION;
    ::MessageBox(NULL,OLE2CT( bstrHTMLText ),NULL,NULL);
    hr = spBody->put_innerHTML(bstrHTMLText);
    }
    }
      

  7.   

    楼主是想在 CYDBrowserHelperObject::OnBeforeNavigate2()中修改网页,并且在 CYDBrowserHelperObject::OnDocumentComplete()中恢复网页吗?
      

  8.   

    是啊.
    下面这函数行不行? 听说IE5.5不支持IPersistStreamInit
    怎么改?//C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\viewhtml.cpp
    BOOL CYDBrowserHelperObject::GetSource(CString& refString)
    {
    BOOL bRetVal = FALSE;
    CComPtr<IDispatch> spDisp = GetHtmlDocument(); if (spDisp != NULL)
    {
    HGLOBAL hMemory;
    hMemory = GlobalAlloc(GMEM_MOVEABLE, 0);
    if (hMemory != NULL)
    {
    CComQIPtr<IPersistStreamInit> spPersistStream = spDisp;
    if (spPersistStream != NULL)
    {
    CComPtr<IStream> spStream;
    if (SUCCEEDED(CreateStreamOnHGlobal(hMemory, TRUE, &spStream)))
    {
    spPersistStream->Save(spStream, FALSE); LPCTSTR pstr = (LPCTSTR) GlobalLock(hMemory);
    if (pstr != NULL)
    {
    // Stream is always ANSI, but CString
    // assignment operator will convert implicitly. bRetVal = TRUE;
    TRY
    {
    refString = pstr;
    }
    CATCH_ALL(e)
    {
    bRetVal = FALSE;
    DELETE_EXCEPTION(e);
    }
    END_CATCH_ALL if(bRetVal == FALSE)
    GlobalFree(hMemory);
    else
    GlobalUnlock(hMemory);
    }
    }
    }
    }
    }

    return bRetVal;
    }
      

  9.   

    在你的代码中CYDBrowserHelperObject::OnBeforeNavigate2()中的spBody和CYDBrowserHelperObject::OnDocumentComplete()中的spBody不是同一页面的接口,你的代码有问题。
      

  10.   

    你是不是想实现FLASH拦截的效果,在没加载完前,先加个本地图片?
    我想只是BHO技术解决不了这个问题,你可以试试用Mimefilter来实现。
      

  11.   

    没有得到IE viewsource看到的源码的办法吗?
      

  12.   

    参考:
    http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx
      

  13.   

    leechiyang(日出东方) ( ) 信誉:100    Blog 
    不行的。试过,得到的是put_innerHTML的东西
      

  14.   

    case DISPID_BEFORENAVIGATE2:      spCComBSTR = getcontext();//这样在最后一次得到的就是本身的源代码,但不知在哪个事件还原,在documentcomplete事件中还原似乎死循环了CComBSTR CYDBrowserHelperObject::getcontext(){ HRESULT hr; CComPtr<IDispatch> spDisp;

    // 取得 IHTMLDocument2 的IDispatch指针
    hr = m_spWebBrowser2->get_Document( &spDisp );
    if( FAILED( hr ) ) return NULL;
    // 取得 IHTMLDocument2 的指针
    CComQIPtr < IHTMLDocument2, &IID_IHTMLDocument2> spDoc( spDisp ); if( spDoc )
    {
    CComPtr < IHTMLElement > spBody;
    hr = spDoc->get_body( &spBody );
    if( FAILED( hr ) ) return NULL; // Get the HTML text
    CComBSTR bstrHTMLText;
    hr = spBody->get_innerHTML( &bstrHTMLText );
    if( FAILED( hr ) ) return NULL;
    return bstrHTMLText;
    //::MessageBox(NULL,_com_util::ConvertBSTRToString(bstrHTMLText),NULL,NULL);
    }
    return NULL;
    }
      

  15.   

    lion_wing(凤之焚)怎么在Read完成前显示一些内容到IE啊?