VC-请问在IDownloadManager的Download事件里如何获取要下载的文件?
请问在IDownloadManager的Download事件里如何获取要下载的文件名?所有参数如下
Download(IMoniker *pmk,
IBindCtx *pbc,
DWORD dwBindVerb,
LONG grfBINDF,
BINDINFO *pBindInfo,
LPCOLESTR pszHeaders,
LPCOLESTR pszRedir,
UINT uiCP)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
通过RegisterBindStatusCallback注册回调事件,通过IMoniker来获取
LPOLESTR pwszUrl = NULL;
pmk->GetDisplayName (pbc, NULL, &pwszUrl);
下面是完整的实现过程:
http://www.codeproject.com/KB/atl/vbmhwb.aspx
在http的header中,有一个Content-disposition,它是MIME 协议的扩展,指示 MIME 用户代理如何显示附加的文件,它的有效值范围在征求意见文档 (RFC) 1806 中讨论。当用户想把请求所得的内容存为一个文件的时候可以根据它的内容提供一个默认的文件名,例如:
Content-Disposition: attachment; attachment;filename=test.xls
因此,可以从Download的参数pszHeaders中找到Content-disposition来获得文件名称。
CBSCBFileDL* dler = new CBSCBFileDL;
IBindStatusCallback *pPrevBSCB = NULL;
HRESULT hr = RegisterBindStatusCallback(pbc, reinterpret_cast<IBindStatusCallback*>(dler), &pPrevBSCB, 0L);
if(SUCCEEDED(hr))
{
IStream *pstm;
ATLTRACE("bind before");
hr = pmk->BindToStorage(pbc, 0, IID_IStream, (void**)&pstm);
ATLTRACE("bind end:%x, %p", hr, pstm);
if (referer.IsEmpty())
referer = dler->m_referer.c_str();
cookie = dler->m_cookie.c_str();
}
else
{
delete dler;
}