none
c++SDK怎么处理WebBrowser的新窗口弹出事件,帮忙看下代码 RRS feed

  • 问题

  • class CWBClientSite :
     public IDispatch, public IOleClientSite, public IOleInPlaceFrame, public IOleInPlaceSite,public IDocHostUIHandler

    主要情况:能跑进去CWebBrowser2_NewWindow2函数里面去,但是不能在制定的IE里打开新网页,会拿默认的360浏览器打开,请教下这个问题怎么解决

    /* [local] */ HRESULT STDMETHODCALLTYPE CWBClientSite::Invoke(
        /* [in] */ DISPID dispIdMember,
        /* [in] */ REFIID riid,
        /* [in] */ LCID lcid,
        /* [in] */ WORD wFlags,
        /* [out][in] */ DISPPARAMS *pDispParams,
        /* [out] */ VARIANT *pVarResult,
        /* [out] */ EXCEPINFO *pExcepInfo,
        /* [out] */ UINT *puArgErr)
    {
     switch(dispIdMember)
     {
     case DISPID_NEWWINDOW2:
      CWebBrowser2_NewWindow2( this, pDispParams->rgvarg[0].pboolVal);
      break;
      default:
     break;
     }

     return(S_OK);

    void CWBClientSite:: CWebBrowser2_NewWindow2( IDispatch* ppDisp, VARIANT_BOOL* pbCancel)
    {
     
     MSG    msg;
     LPDISPATCH result = NULL;
     IWebBrowser2 *pBrowserApp;
     IOleObject  *browserObject;
     WNDCLASSEX wc = {0};
     HRESULT hr  = -1;
     LPDISPATCH DbgppDisp = NULL;

     *pbCancel=FALSE;
     
     SendMessageW(
      m_hWindow,
      WM_NEW_IEVIEW,
      (WPARAM)&(msg.hwnd),
      0);
     CWebBrowser *pWebBrowser = (CWebBrowser *)GetWindowLong(msg.hwnd, GWL_USERDATA);
     browserObject = pWebBrowser->GetIOleObject();
     
     //browserObject = *((IOleObject **)GetWindowLong(m_hWindow, GWL_USERDATA));
     hr = browserObject->QueryInterface(IID_IWebBrowser2, (void**)&pBrowserApp);
     if ( SUCCEEDED(hr) )
     { 

      //pBrowserApp->put_RegisterAsBrowser(*pbCancel);
      hr = pBrowserApp->get_Application(&DbgppDisp);
      
      if ( SUCCEEDED(hr) )
      {
       ppDisp  = DbgppDisp;
      } 
     }

    }
    }

    2011年5月13日 9:37

答案

  • 我认为大多处是case DISPID_NEWWINDOW2:
      CWebBrowser2_NewWindow2( this, pDispParams->rgvarg[0].pboolVal);这个地方的参数有问题。。。。大家有什么看法

    解决了,CWebBrowser2_NewWindow2( pDispParams->rgvarg[1].ppdispVal, pDispParams->rgvarg[0].pboolVal);,而且下newwindow里获取到正确的browserObject,就是和创建的时候一样的指针
    2011年5月14日 1:17

全部回复

  • 我认为大多处是case DISPID_NEWWINDOW2:
      CWebBrowser2_NewWindow2( this, pDispParams->rgvarg[0].pboolVal);这个地方的参数有问题。。。。大家有什么看法
    2011年5月13日 10:14
  • 我认为大多处是case DISPID_NEWWINDOW2:
      CWebBrowser2_NewWindow2( this, pDispParams->rgvarg[0].pboolVal);这个地方的参数有问题。。。。大家有什么看法

    解决了,CWebBrowser2_NewWindow2( pDispParams->rgvarg[1].ppdispVal, pDispParams->rgvarg[0].pboolVal);,而且下newwindow里获取到正确的browserObject,就是和创建的时候一样的指针
    2011年5月14日 1:17
  • 你好,

    很高兴听到您已经通过自己的努力解决了问题,同时也很感谢您能够在这分享您的解决方案,这对于其他与您有相同的问题的用户有着极大的帮助。

    希望您能偶再次来到MSDN中文论坛提出您的问题。


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年5月16日 3:34
  • 您好,您的这个代码能发给我一份么?我也想用sdk写,但是事件搞不明白,对com不熟悉,需求不是特别高,所以不想特别研究,我qq 邮箱 412316488@qq.com。谢谢了

    2011年9月13日 2:19