求救:在IInternetProtocolSink的ReportData里Read一直返回E_PENDING导致死循环

「已注销」 2008-12-19 03:40:18
我是拿凤之焚的《网页源码过滤》改动的,具体原文出自:http://blog.csdn.net/lion_wing/archive/2006/06/27/839134.aspx

STDMETHODIMP CHTMLFilter::ReportData( DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
{
USES_CONVERSION;
//存储网页代码
CStringA Ts("");
char p[1024];
HRESULT hr;
ULONG Readtotal;

do
{
hr = UrlMonProtocol->Read(p, sizeof(p)-1, &Readtotal);

if(Readtotal > 0)
{
p[Readtotal]='\0';
CStringA pTemp(p);
Ts=Ts+pTemp;
}

}while((hr != S_FALSE) && (hr != INET_E_DOWNLOAD_FAILURE) && (hr != INET_E_DATA_NOT_AVAILABLE));


if(hr == S_FALSE)
{
//下面对网页代码进行过滤,代码过长,略去
.................

//为浏览器准备数据
TotalSize= Ts.GetLength() ;
const char * pTs = Ts.GetBuffer(Ts.GetLength());
ULONG cbWritten;
DataStream->Write(pTs,Ts.GetLength(),&cbWritten);
Ts.ReleaseBuffer();
pTs = NULL;

ULARGE_INTEGER Dummy;
_LARGE_INTEGER zero;
zero.QuadPart =0;
DataStream->Seek ( zero, STREAM_SEEK_SET, &Dummy);

UrlMonProtocolSink->ReportData(BSCF_FIRSTDATANOTIFICATION | BSCF_LASTDATANOTIFICATION | BSCF_DATAFULLYAVAILABLE,
TotalSize, TotalSize);
UrlMonProtocolSink->ReportResult(S_OK, 0, NULL);
}
else
{
Abort(hr, 0);
}
return S_OK;
}


===============================
不知道为什么,有时候会在我标红的那里一直返回E_PENDING而导致那个do...while死循环。
请教高手指点了。
...全文
140 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dgvictor 2008-12-31
有试在VS2005下编译通过VBMHWB?
回复
KeSummer 2008-12-19
返回E_PENDING的时候,通常是请求被挂起,建议这时候把程序断下来,看看各个线程的栈。
回复
jameshooo 2008-12-19
既然你参考的是他的文章,可以直接向作者提问,也许能得到正确的答案。
我个人觉得文章写得有些混乱,尤其是接口调用关系描述,让人摸不着头脑,到底谁是谁,谁在调用谁,我愣是没看懂。按照我写协议过滤器的经验,实现IInternetProtocol接口就达到了目标,从未实现过IInternetProtocolSink接口,所以我也无法确认你的问题到底在哪。
回复
「已注销」 2008-12-19
一直在线,期待高手
回复
fandh 2008-12-19
高难度,帮顶!顺便学习一下!
回复
发帖
ATL
创建于2007-09-28

3214

社区成员

ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
申请成为版主
帖子事件
创建了帖子
2008-12-19 03:40
社区公告
暂无公告