3,245
社区成员
发帖
与我相关
我的任务
分享
class ATL_NO_VTABLE CFlashFilter :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CFlashFilter, &CLSID_FlashFilter>,
public IDispatchImpl<IFlashFilter, &IID_IFlashFilter, &LIBID_AdBlockerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IInternetProtocol,
public IInternetProtocolSink
BEGIN_COM_MAP(CFlashFilter)
COM_INTERFACE_ENTRY(IFlashFilter)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY_IID(IID_IInternetProtocol, IInternetProtocol)
COM_INTERFACE_ENTRY_IID(IID_IInternetProtocolSink, IInternetProtocolSink)
END_COM_MAP()
private:
CComPtr<IInternetProtocolSink> m_pProtocolSink;
CComPtr<IInternetBindInfo> m_pBindInfo;
CComPtr<IInternetProtocol> m_pProtocol;
//存储IInternetProtocol、IInternetProtocolSink
m_pProtocolSink = pOIProtSink;
if ( m_pProtocolSink == NULL )
return S_FALSE;
m_pBindInfo = pOIBindInfo;
HRESULT hr = m_pBindInfo->QueryInterface( IID_IInternetProtocol, (void**)&m_pProtocol );
ULONG Fetched;
// 获取网页地址
m_pBindInfo->GetBindString( BINDSTRING_URL, &m_pUrl, 1, &Fetched );
STDMETHODIMP CFlashFilter::ReportData( DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax) USES_CONVERSION;
// 存储网页代码
std::string ts = "";
char buf[1024] = {0};
HRESULT hr;
ULONG ReadTotal = 0;
do{
memset( buf, 0x0, sizeof(buf) );
//m_pProtocolSink->ReportResult( S_OK, S_OK, NULL ); // 调用这个正确,可以执行
hr = m_pProtocol->Read( buf, sizeof(buf)-1, &ReadTotal ); // 出错,m_pProtoc指针不是空的,这时IE也死了
std::string temp(buf);
ts += temp;
}while ( (hr != S_FALSE) && (hr != INET_E_DOWNLOAD_FAILURE) && (hr != INET_E_DATA_NOT_AVAILABLE) );
_pProtocolSink->ReportData( grfBSCF, ulProgress, ulProgressMax ); // 直接调用这个也出错,IE死掉
class ATL_NO_VTABLE CIeFilter :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CIeFilter, &CLSID_IeFilter>,
public IObjectWithSiteImpl<CIeFilter>,
public IDispatchImpl<IIeFilter, &IID_IIeFilter, &LIBID_AdBlockerLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IPersistStreamInitImpl<CIeFilter>, // 手工添加持续性接口
public IInputObject,
public IDeskBand,
public IDispEventImpl< 1, CIeFilter, &IID_IIeFilter, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 0> // 编译时这句出错
{
// DWebBrowserEvents2事件
BEGIN_SINK_MAP(CIeFilter)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()
public:
//DWebBrowserEvents2 事件
void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);
}
// 错误提示
1>e:\sourcecode\adblocker\iefilter.h(29) : error C2975: 'wMajor' : invalid template argument for 'ATL::IDispEventImpl', expected compile-time constant expression
1>d:\microsoft visual studio 9.0\vc\atlmfc\include\atlcom.h(4433) : see declaration of 'wMajor'
1>e:\sourcecode\adblocker\iefilter.h(29) : error C2974: 'ATL::IDispEventImpl' : invalid template argument for 'tihclass', type expected
1>d:\microsoft visual studio 9.0\vc\atlmfc\include\atlcom.h(4434) : see declaration of 'ATL::IDispEventImpl'
1>e:\sourcecode\adblocker\iefilter.h(30) : error C2955: 'ATL::IDispEventImpl' : use of class template requires template argument list
1>d:\microsoft visual studio 9.0\vc\atlmfc\include\atlcom.h(4434) : see declaration of 'ATL::IDispEventImpl'
1>e:\sourcecode\adblocker\iefilter.h(30) : fatal error C1903: unable to recover from previous error(s); stopping compilation
hr = m_pProtocol->Read( buf, sizeof(buf)-1, &ReadTotal ); // 这里出错的原因是在start函数里赋错了值
// 之前我是通过start中的IInternetBindInfo *pOIBindInf这个参数得到pProtocol 的,这样是错误的,应该使用参数 IInternetProtocolSink *pOIProtSink得到pProtocol 应该改成
// HRESULT hr = m_pBindInfo->QueryInterface( IID_IInternetProtocol, (void**)&m_pProtocol ); // 错误的方法
HRESULT hr = m_pProtocolSink->QueryInterface( IID_IInternetProtocol, (void**)&m_pProtocol ); // 这才是正确的方法