方式一
void CCustomHtmlView::OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel)
{
CWebNavigate *pDlg = new CWebNavigate;
pDlg->Create(CWebNavigate::IDD,this);
pDlg->OnNewWindow2(pDisp);
*Cancel = FALSE; //如果此处值为TRUE,则无法在新窗口中浏览网页 此处值必须为FLASH
//CHtmlView::OnNewWindow2(ppDisp, Cancel);
}
.............
void CWebNavigate::OnNewWindow2(LPDISPATCH *ppDisp)
{
m_wndWeb.SetRegisterAsBrowser(TRUE); //m_wndWeb 为CHtmlView对象
*pDisp = m_wndWeb.GetApplication();
}
方式2:
实现DWebBrowserEvents2
class CIEEvent : public SHDocVw::DWebBrowserEvents2
{
public:
CIEEvent();
virtual ~CIEEvent();
VOID SetIEhWnd(HWND hWnd){m_hIEWnd = hWnd;}
BOOL Advise(IUnknown *pUnKnown);
VOID UnAdvise();
virtual void BeforeNavigate2(DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult);
virtual ULONG STDMETHODCALLTYPE AddRef() { return 1L; }
virtual ULONG STDMETHODCALLTYPE Release() { return 1L; }
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT __RPC_FAR *pctinfo){return E_NOTIMPL;}
virtual HRESULT STDMETHODCALLTYPE QueryInterface(/* [in] */ REFIID riid,/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
{
if (riid == IID_IUnknown || riid == IID_IDispatch || riid ==DIID_DWebBrowserEvents2)
{
*ppvObject = (void*)this;
return S_OK;
}
return E_NOINTERFACE;
}
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(/* [in] */ UINT iTInfo,/* [in] */ LCID lcid,/* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo){return E_NOTIMPL;}
virtual HRESULT STDMETHODCALLTYPE Invoke(/* [in] */ DISPID dispIdMember,/* [in] */ REFIID riid,/* [in] */ LCID lcid,/* [in] */ WORD wFlags,/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,/* [out] */ VARIANT __RPC_FAR *pVarResult,/* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,/* [out] */ UINT __RPC_FAR *puArgErr);
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(/* [in] */ REFIID riid,/* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,/* [in] */ UINT cNames,/* [in] */ LCID lcid,/* [size_is][out] */ DISPID __RPC_FAR *rgDispId){return E_NOTIMPL;}
protected:
CComQIPtr<SHDocVw::IWebBrowser2, &IID_IWebBrowser2>m_spWebBrowser2;
CComQIPtr<IConnectionPoint>m_spCp;
DWORD m_dwCookIe;
HWND m_hIEWnd;
private:
VOID OnTitleChange(LPCTSTR lpszTitle);
};
//
// Construction/Destruction
//
CIEEvent::CIEEvent()
{
}
CIEEvent::~CIEEvent()
{
}
BOOL CIEEvent::Advise(IUnknown *pUnKnown)
{
m_spWebBrowser2=(SHDocVw::IWebBrowser2 *)pUnKnown;
CComQIPtr<IConnectionPointContainer> spContainer( m_spWebBrowser2 );
HRESULT hr=spContainer->FindConnectionPoint(DIID_DWebBrowserEvents2,&m_spCp);
if (m_spCp)
{
hr=m_spCp->Advise(this,&m_dwCookIe);
return TRUE;
}
else
return FALSE;
}
void CIEEvent::BeforeNavigate2(DISPPARAMS __RPC_FAR *pDispParams, VARIANT __RPC_FAR *pVarResult)
{
USES_CONVERSION;
char *pstrURL=NULL;
if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);
pstrURL = OLE2A(varURL.bstrVal);
}
if (pstrURL==NULL) return;
}
HRESULT STDMETHODCALLTYPE CIEEvent::Invoke(/* [in] */ DISPID dispIdMember,/* [in] */ REFIID riid,/* [in] */ LCID lcid,/* [in] */ WORD wFlags,/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,/* [out] */ VARIANT __RPC_FAR *pVarResult,/* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,/* [out] */ UINT __RPC_FAR *puArgErr)
{
USES_CONVERSION;
if (!pDispParams)
return E_INVALIDARG;
switch(dispIdMember)
{
break;
case 273: //DISPID_NEWWINDOW3 = 273
{
//0 : bstrUrl, 1 : bstrContext, 2 : dwFlags, 3 : *bCancel, 4 : **pDisp
//CComBSTR url = pDispParams->rgvarg[0].bstrVal;
/*
CComVariant varURL(pDispParams->rgvarg[0].bstrVal);
varURL.ChangeType(VT_BSTR);
CHAR *pstrURL = OLE2A(varURL.bstrVal); //新窗口URL地址
AfxGetMainWnd()->SendMessage(WM_IE_NEWWINDOW,(WPARAM)0,(LPARAM)pDispParams->rgvarg[4].ppdispVal);
*(pDispParams->rgvarg[3].pboolVal) = VARIANT_FALSE; //此处值也必须为VARIANT_FALSE 开始我在测试时,此处值为VARIANT_TRUE,然后通过pstrURL参数打开自定义的URL,在测试中发现可以正常打开一般URL但如果有POST等参数传递时就会出错,显示不正常
}
break;
}
return S_OK;
}
VOID CIEEvent::UnAdvise()
{
if (m_spCp && m_dwCookIe!=-1)
{
m_spCp->Unadvise(m_dwCookIe);
m_dwCookIe =-1;
}
}
VOID CIEEvent::OnTitleChange(LPCTSTR lpszTitle)
{
}