关于 Asynchronous Pluggable Protocols 中Namespace Handlers的问题

thinkSJ 2008-07-24 05:04:25
MSDN上说实现Namespace handler需要继承IInternetProtocol接口, 再用IInternetSession.RegisterNameSpace注册一下就行了.

我在代码中注册了对HTTP的处理.用WebBrowser控件访问网页时的确会调用IInternetProtocol中的接口函数, 在这些接口函数中我通过Wininet系统函数来访问网络.但经过一段时间后.控件上会显示:
//////////
已取消到该网页的导航

您可以尝试以下操作:
刷新该网页。

在没用使用RegisterNameSpace注册的情况下,WebBrowser控件是可以正常工作的.另外关于Namespace handlers的资料网上似乎很少, Google了两天也没什么大收获.

烦请有这方面经验的朋友为我解答一下!
...全文
135 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
aa3000 2008-07-28
  • 打赏
  • 举报
回复
要当数据真正下载完成才能调用 pOIProtSink->ReportData (BSCF_DATAFULLYAVAILABLE, 100, 100); 就是说异步获取完数据的时候才调用,其余时候不必调用.
scq2099yt 2008-07-25
  • 打赏
  • 举报
回复
up
thinkSJ 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yjgx007 的回复:]
关于这个, 微软在MSDN上讲得很少, 也没有示例代码.
网上文档和代码更是很少, 我试过相关示例代码, 出错几率比较高, 没有socket稳定.
[/Quote]
花在这上面的时间已经超过2个星期了,最开始是研究一个小的FLV嗅探工具才知道有异步协议处理这种东西,这个小工具用的应该就是SOCKET函数了,第一次写这种东西,非常感谢关注.

[Quote=引用 7 楼 aa3000的回复:]

LZ 需要 pOIProtSink->ReportData (BSCF_DATAFULLYAVAILABLE, 100, 100); 才行
[/Quote]
多谢aa3000, 我将这句代码放到了start函数的最后,是可以工作了.但WebBrowser中显示的内容非常的粗糙,于是在Read函数 的最后也加了这句.但代码会崩溃,这是为何?
aa3000 2008-07-25
  • 打赏
  • 举报
回复
LZ 需要 pOIProtSink->ReportData (BSCF_DATAFULLYAVAILABLE, 100, 100); 才行
yjgx007 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 thinkSJ 的回复:]
谢谢.我去试试..

不过有个问题.它即然号称是异步的协议处理.为何不能用异步处理呢?
[/Quote]
关于这个, 微软在MSDN上讲得很少, 也没有示例代码.
网上文档和代码更是很少, 我试过相关示例代码, 出错几率比较高, 没有socket稳定.
thinkSJ 2008-07-25
  • 打赏
  • 举报
回复
谢谢.我去试试..

不过有个问题.它即然号称是异步的协议处理.为何不能用异步处理呢?
yjgx007 2008-07-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 thinkSJ 的回复:]
请教下007该如何写才好.我的Start 与Read函数如下(代码是别人那里A过来的):
C/C++ codeHRESULT STDMETHODCALLTYPE Start(/*[in]*/LPCWSTR szUrl,/*[in]*/IInternetProtocolSink __RPC_FAR*pOIProtSink,/*[in]*/IInternetBindInfo __RPC_FAR*pOIBindInfo,/*[in]*/DWORD grfPI,/*[in]*/DWORD dwReserved)
{
USES_CONVERSION;constchar*AgentName="test";constchar*Url=W2CA (szUrl);

m_pProtocolSink=pOIPro…
[/Quote]
用到了异步下载, InternetSetStatusCallback
可能导至不稳定的原因, 建议你直接用socket代理转发请求, 网上有相关示例, 或者, 不要用异步下载.
thinkSJ 2008-07-24
  • 打赏
  • 举报
回复
请教下007该如何写才好.我的Start 与Read函数如下(代码是别人那里A过来的):

HRESULT STDMETHODCALLTYPE Start(
/* [in] */ LPCWSTR szUrl,
/* [in] */ IInternetProtocolSink __RPC_FAR *pOIProtSink,
/* [in] */ IInternetBindInfo __RPC_FAR *pOIBindInfo,
/* [in] */ DWORD grfPI,
/* [in] */ DWORD dwReserved)
{
USES_CONVERSION;
const char * AgentName = "test";
const char * Url = W2CA (szUrl);

m_pProtocolSink = pOIProtSink;
m_pBindInfo = pOIBindInfo;

m_hInternetSession = InternetOpen (AgentName, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, INTERNET_FLAG_ASYNC);
if (!m_hInternetSession)
{
ATLTRACE(_T("InternetOpen () failed\n"));
return S_FALSE;
}
else
ATLTRACE(_T("InternetOpen () succeeded, handle is 0x%lX\n"), m_hInternetSession);

InternetSetStatusCallback (m_hInternetSession, StatusCallback);


InternetOpenUrl(m_hInternetSession, Url, NULL, 0, INTERNET_FLAG_RELOAD, (DWORD) this);
return S_OK;
}

HRESULT STDMETHODCALLTYPE Read(
/* [length_is][size_is][out][in] */ void __RPC_FAR *pv,
/* [in] */ ULONG cb,
/* [out] */ ULONG __RPC_FAR *pcbRead)
{
BOOL Status = InternetReadFile (m_hHttpSession, pv, cb, pcbRead);
ATLTRACE(_T("nBuffer is %ld\n"), *pcbRead);

if (Status == FALSE)
{
DWORD error = GetLastError();
ATLTRACE(_T("Errno = %d\n"), error);
return INET_E_DOWNLOAD_FAILURE;
}
else
if (*pcbRead == cb)
{
return S_OK;
}

return S_FALSE;
}
yjgx007 2008-07-24
  • 打赏
  • 举报
回复
那就是你自已写的代理访问有问题?
thinkSJ 2008-07-24
  • 打赏
  • 举报
回复
很奇怪,居然发不了200分的贴子..
大家帮帮忙啊!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧