描述:
这个问题之前发过一次贴,但那个问题已经解决了,现在迎来另一个问题
http://topic.csdn.net/u/20080908/16/e7c6cc3f-ae78-454f-8b74-b1234d196b3f.html
问题是:
类继承接口如下,并实现了它们的方法
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;
在Start方法中的代码
//存储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 );
ReportData方法
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死掉
请问高手这个问题该怎么解决,解决了另开贴再送分
解决方案1:
对象已经实现了IInternetProtoco接口,
成员函数里为啥还要 CComPtr<IInternetProtocol> m_pProtocol;
啊
msdn:
After your IInternetProtocolSink::ReportResult method is called, your application should call the IInternetProtocol::LockRequest method to lock the resource you are reading from the protocol handler. Then your application should call the IInternetProtocolRoot::Terminate method.
只需要实现IInternetProtocol接口即可,无需实现IInternetProtocolSink,你搞复杂了。IInternetProtocolSink指针在Start里面会传给你,你保存下来备用。