Blog开通了挺长时间,但一直想不到写些什么。
今天上午碰到一个问题,怎么在HtmlView中屏蔽弹出的广告小窗口,用NewWindow2事件不能处理,没有URL参数。查了一下,需要实现DWebBrowserEvents2接口的NewWindow3事件的处理。但在网上搜不到相关的代码, 最后决心自己来写。现在将实现方法贴出来,有兴趣的可以参考一下.
第一步: 先得实现DWebBrowserEvents2接口,代码如下:
#import "C:/WINDOWS/System32/shdocvw.dll"
#pragma once
class DWebBrowserEvents2Impl : public DWebBrowserEvents2
{
// IUnknown methods
STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// IDispatch methods
STDMETHOD(GetTypeInfoCount)(UINT* pctinfo);
STDMETHOD(GetTypeInfo)(UINT iTInfo,
LCID lcid,
ITypeInfo** ppTInfo);
STDMETHOD(GetIDsOfNames)(REFIID riid,
LPOLESTR* rgszNames,
UINT cNames,
LCID lcid,
DISPID* rgDispId);
STDMETHOD(Invoke)(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams,
VARIANT __RPC_FAR *pVarResult,
EXCEPINFO __RPC_FAR *pExcepInfo,
UINT __RPC_FAR *puArgErr);
public:
DWebBrowserEvents2Impl();
virtual ~DWebBrowserEvents2Impl();
};
第二步: 在HtmlView的OnInitialUpdate中要将 DWebBrowserEvents2Impl m_events (在View类声明)连接到Html的自动化接口。
代码:
LPDISPATCH pDis = GetApplication( );
ASSERT(pDis);
if (pDis)
{
LPCONNECTIONPOINTCONTAINER pCPC = NULL;
LPCONNECTIONPOINT pCP = NULL;
HRESULT hr = pDis->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&pCPC);
ASSERT(SUCCEEDED(hr));
if (SUCCEEDED(hr))
{
hr = pCPC->FindConnectionPoint(__uuidof(SHDocVw::DWebBrowserEvents2Ptr), &pCP);
ASSERT(SUCCEEDED(hr));
if ( SUCCEEDED(hr) )
{
DWORD dwCookie;
hr = pCP->Advise((LPUNKNOWN)&m_events, &dwCookie);
ASSERT(SUCCEEDED(hr));
}
}
}
最后:在DWebBrowserEvents2Impl::Invoke函数里监听NewWindow3 Event:
HRESULT __stdcall DWebBrowserEvents2Impl::Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams,
VARIANT __RPC_FAR *pVarResult,
EXCEPINFO __RPC_FAR *pExcepInfo,
UINT __RPC_FAR *puArgErr)
{
if (dispIdMember == 0x111) //NewWindow3 Event
{//
/*void NewWindow3(
IDispatch **&ppDisp,
VARIANT_BOOL *&Cancel,
DWORD dwFlags,
BSTR bstrUrlContext,
BSTR bstrUrl
);*/
DWORD dwFlags = (DWORD)pDispParams->rgvarg[2].lVal;
if (!(dwFlags&0x0002))
{ //stop the advertising
VARIANT_BOOL * pCancel = (VARIANT_BOOL *)pDispParams->rgvarg[3].pboolVal ;
* pCancel = TRUE;
}
}
return NOERROR;
}
程序在VC6.0, WindowsXP SP2中调试通过。
今天上午碰到一个问题,怎么在HtmlView中屏蔽弹出的广告小窗口,用NewWindow2事件不能处理,没有URL参数。查了一下,需要实现DWebBrowserEvents2接口的NewWindow3事件的处理。但在网上搜不到相关的代码, 最后决心自己来写。现在将实现方法贴出来,有兴趣的可以参考一下.
第一步: 先得实现DWebBrowserEvents2接口,代码如下:
#import "C:/WINDOWS/System32/shdocvw.dll"
#pragma once
class DWebBrowserEvents2Impl : public DWebBrowserEvents2
{
// IUnknown methods
STDMETHOD(QueryInterface)(REFIID riid, LPVOID* ppv);
STDMETHOD_(ULONG, AddRef)();
STDMETHOD_(ULONG, Release)();
// IDispatch methods
STDMETHOD(GetTypeInfoCount)(UINT* pctinfo);
STDMETHOD(GetTypeInfo)(UINT iTInfo,
LCID lcid,
ITypeInfo** ppTInfo);
STDMETHOD(GetIDsOfNames)(REFIID riid,
LPOLESTR* rgszNames,
UINT cNames,
LCID lcid,
DISPID* rgDispId);
STDMETHOD(Invoke)(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams,
VARIANT __RPC_FAR *pVarResult,
EXCEPINFO __RPC_FAR *pExcepInfo,
UINT __RPC_FAR *puArgErr);
public:
DWebBrowserEvents2Impl();
virtual ~DWebBrowserEvents2Impl();
};
第二步: 在HtmlView的OnInitialUpdate中要将 DWebBrowserEvents2Impl m_events (在View类声明)连接到Html的自动化接口。
代码:
LPDISPATCH pDis = GetApplication( );
ASSERT(pDis);
if (pDis)
{
LPCONNECTIONPOINTCONTAINER pCPC = NULL;
LPCONNECTIONPOINT pCP = NULL;
HRESULT hr = pDis->QueryInterface(IID_IConnectionPointContainer, (LPVOID*)&pCPC);
ASSERT(SUCCEEDED(hr));
if (SUCCEEDED(hr))
{
hr = pCPC->FindConnectionPoint(__uuidof(SHDocVw::DWebBrowserEvents2Ptr), &pCP);
ASSERT(SUCCEEDED(hr));
if ( SUCCEEDED(hr) )
{
DWORD dwCookie;
hr = pCP->Advise((LPUNKNOWN)&m_events, &dwCookie);
ASSERT(SUCCEEDED(hr));
}
}
}
最后:在DWebBrowserEvents2Impl::Invoke函数里监听NewWindow3 Event:
HRESULT __stdcall DWebBrowserEvents2Impl::Invoke(DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS __RPC_FAR *pDispParams,
VARIANT __RPC_FAR *pVarResult,
EXCEPINFO __RPC_FAR *pExcepInfo,
UINT __RPC_FAR *puArgErr)
{
if (dispIdMember == 0x111) //NewWindow3 Event
{//
/*void NewWindow3(
IDispatch **&ppDisp,
VARIANT_BOOL *&Cancel,
DWORD dwFlags,
BSTR bstrUrlContext,
BSTR bstrUrl
);*/
DWORD dwFlags = (DWORD)pDispParams->rgvarg[2].lVal;
if (!(dwFlags&0x0002))
{ //stop the advertising
VARIANT_BOOL * pCancel = (VARIANT_BOOL *)pDispParams->rgvarg[3].pboolVal ;
* pCancel = TRUE;
}
}
return NOERROR;
}
程序在VC6.0, WindowsXP SP2中调试通过。