RT
重载OnBeforeNavigate函数可以获得URL,但是无法取消,郁闷

解决方案 »

  1.   

    virtual void OnBeforeNavigate2(
       LPCTSTR lpszURL,
       DWORD nFlags,
       LPCTSTR lpszTargetFrameName,
       CByteArray& baPostedData,
       LPCTSTR lpszHeaders,
       BOOL* pbCancel 
    );注意它的最后一个参数,设置为非0值可以取消操作.
    pbCancel A pointer to a cancel flag. An application can set this parameter to nonzero to cancel the navigation operation, or to zero to allow it to proceed. 
      

  2.   

    楼上的几位
    CDHtmlDialog中的OnBeforeNavigate2被设置成了非虚函数了,没有办法重载。:(
      

  3.   

    void Ccdhtml_t1Dlg::OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel)
    {     
         // .......
          CDHtmlDialog::_OnBeforeNavigate2( pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel );
    }
      

  4.   

    不可能。CDHtmlDialog的这个函数本身就是虚函数,什么叫被改成了非虚函数?谁改的?
      

  5.   

    在dlgdhtml.cpp中定义了CDHtmlDialog类的事件处理
    ON_EVENT(CDHtmlDialog, AFX_IDC_BROWSER, 250 /* BeforeNavigate2 */, _OnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)但是CDHtmlDialog类中_OnBeforeNavigate2并不是虚函数,可以看afxdhtml.h中的474行我尝试在自己的类中处理也定义一个ON_EVENT(CXXXDialog, AFX_IDC_BROWSER, 250 /* BeforeNavigate2 */, _OnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL),但是运行时会出异常请各位高手指正
      

  6.   

    _OnBeforeNavigate2 会调用虚函数 OnBeforeNavigate,所以你重载OnBeforeNavigate就行了
      

  7.   

    OnBeforeNavigate只有2个参数LPDISPATCH pDisp, LPCTSTR szUrl,不知道如何取消事件
      

  8.   

    哦,是有参数问题。你现在唯一的办法就是自己实现一个DWebBrowserEvents2连接点接口并连接到IWebBrowser2上,然后在BeforeNavigate2被调用的时候来设置cancel的值
      

  9.   

    看看连接点的原理和使用步骤吧。CDHtmlDialog本身实现了一个连接点接口,但是可控制的东西太少,所以需要实现另一个连接点,自己完全控制
      

  10.   

    找到一个可行的方法在.h文件中定义一个函数
    DECLARE_EVENTSINK_MAP()
    virtual void XOnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel);
    在.CPP中BEGIN_EVENTSINK_MAP(CXXXHTMLDialog, CDHtmlDialog)
    ON_EVENT(CXXXHTMLDialog, AFX_IDC_BROWSER, 250 /* BeforeNavigate2 */, XOnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
    END_EVENTSINK_MAP()void CXXXHTMLDialog::XOnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel) {
    //设置Cancel为TRUE就可以取消这个请求了
    CString str(V_BSTR(URL));
    OnBeforeNavigate(pDisp, str);
    }