描述:
我仿照CodeProject上的例子做了一个Popup Blocker,是可以拦截弹出窗口了,但同时也无法打开网页上的二级链接了,请问高手是怎么回事,该 如何解决。
我的环境:Windows 2000,VC++6.0
主要代码如下:
CPopKiller::CPopKiller()
{
m_bBlockNewWindow=TRUE;
m_dwBrowserCookie=0;
}
HRESULT CPopKiller::SetSite(IUnknown *pUnkSite)
{
USES_CONVERSION;
HRESULT hr=E_FAIL;
if (!pUnkSite)
{
ATLTRACE(_T("SetSite(): pUnkSite is NULL\n"));
}
else
{
m_spWebBrowser2 = pUnkSite;
if (m_spWebBrowser2)
{
hr = ManageBrowserConnection(ConnType_Advise);
if (FAILED(hr))
{
ATLTRACE(_T("Failure sinking events from IWebBrowser2\n"));
}
}
else
{
ATLTRACE(_T("QI for IWebBrowser2 failed\n"));
}
}
return hr;
}
HRESULT CPopKiller::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)
{
case DISPID_NEWWINDOW2:
ATLTRACE(_T("(%ld) DISPID_NEWWINDOW2\n"), ::GetCurrentThreadId());
if (m_bBlockNewWindow)
{
*pDispParams->rgvarg[0].pboolVal = TRUE;
}
m_bBlockNewWindow = TRUE;
break;
case DISPID_QUIT:
ManageBrowserConnection(ConnType_Unadvise);
break;
default:
break;
}
return S_OK;
}
HRESULT CPopKiller::ManageBrowserConnection(ConnectType eConnectType)
{
ATLASSERT(m_spWebBrowser2);
if (!m_spWebBrowser2)
return S_OK;
HRESULT hr = E_FAIL;
if (eConnectType == ConnType_Advise)
{
ATLASSERT(m_dwBrowserCookie == 0);
hr = AtlAdvise (m_spWebBrowser2, (IDispatch*)this, __uuidof(DWebBrowserEvents2), &m_dwBrowserCookie);
}
else
{
hr = AtlUnadvise(m_spWebBrowser2, __uuidof(DWebBrowserEvents2), m_dwBrowserCookie);
m_dwBrowserCookie = 0;
}
ATLASSERT(SUCCEEDED(hr));
return hr;
}
呵呵,CodeProject上的那个老版本的也有这个问题,但新版本的没有这个问题了,参考了他的代码,但问题如故。