none
自定义的IDownloadManager在遇到重定向下载时如何处理呢? RRS feed

  • 问题

  • 扩展CHtmlView后实现了IDownloadManager的Download接口,可从IMoniker参数中只能得到下载页的URL,这种方法在遇到服务器使用重定向下载的方法时就搞不定了.

    从哪里可得到http响应头中的重定向文件地址呢?


    看网上很多例子都是从IMoniker中得到GetDisplayName,可这是重定向前的地址,对于一些情形不适用.
    2011年6月3日 12:32

答案

全部回复

  • 找到有人说:

    You install your implementation of IBindStatusCallback into the bind
    context (RegisterBindStatusCallback) and initiate the download
    (IMoniker::BindToStorage). Eventually, you'll get
    IHttpNegotiate::OnResponse call, complete with response headers.

     

    不过还是不明白.要自己实现这两个接口并注册?IBindStatusCallback 和 IHttpNegotiate.

     

    也就是说进入Download接口时实现还没有收到response,

    那 pszHeader参数有什么用?........

     

    大大们,求解呀

    2011年6月3日 13:58
  • http://groups.google.com/group/microsoft.public.inetsdk.programming.urlmonikers/search?group=microsoft.public.inetsdk.programming.urlmonikers&q=IDownloadManager

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已建议为答案 Rob Pan 2011年6月21日 8:59
    • 已标记为答案 Rob Pan 2011年6月30日 8:50
    2011年6月4日 17:08
    版主
  • NND,

    国内连GROUPS都打不开....

     

    郁闷呀....

    2011年6月5日 0:32
  • 现在虽然能打开Groups,但上面的链接好像失效了。。。。

    同样郁闷呀。

    2014年3月10日 11:39
  • 谢谢蒋晟,链接可以打开,不过里面的代码下载链接好像失效了,我叫澳洲的旧同事试过都不能下载。

    看过很多你对这方面的回复,我才终于实现如何在VB中截获IDOWNLOADMANAGER,也想着通过RegisterBindStatusCallback获取下载文件,可其中有个参数_In_  IBindStatusCallback *pbsc,中不知要传递什么值。

        Public Function Download(ByVal pmk As Microsoft.VisualStudio.OLE.Interop.IMoniker, ByVal pbc As Microsoft.VisualStudio.OLE.Interop.IBindCtx, ByVal dwBindVerb As UInteger, ByVal grfBINDF As Integer, ByVal pBindInfo As System.IntPtr, ByVal pszHeaders As String, ByVal pszRedir As String, ByVal uiCP As UInteger) As Integer Implements IDownloadManager.Download
            
            Dim instance As IBindStatusCallback
            Dim hr As Integer = RegisterBindStatusCallback(pbc, Me, Nothing, 0L)
    
            If hr = E_INVALIDARG Then
                MsgBox("参数有错误")
            End If
    
            If hr = E_OUTOFMEMORY Then
                MsgBox("内存申请错误")
            End If
            If hr = E_FAIL Then
                MsgBox("E_FAIL :No new callbacks allowed after binding has started.")
            End If
           
            Return S_OK
    End Function


    返回结果是E_FAIL.

    在VB.NET中如何调用RegisterBindStatusCallback呢?

    像这种情况是否属于异步传输呢?

    谢谢。

    • 已编辑 zs李四 2014年3月17日 11:39
    2014年3月17日 11:26
  • me是不是实现IBindStatusCallback?为什么给ppbscPrevious参数传递Nothing?

    代码可以参考https://svn.re-motion.org/svn/Remotion/tags/1.11.4.0/Dms/Clients.Windows.WebBrowserControl/ComImplementations/



    Visual C++ MVP

    • 已建议为答案 zs李四 2014年3月19日 10:06
    2014年3月17日 17:31
    版主
  • 十分感谢!

    我搜索到有些代码是这样写的:hr = RegisterBindStatusCallback(m_spBindCtx, static_cast<IBindStatusCallback*>(this), 0, 0L);参考这里的:ftp://host41-158-110-95.serverdedicati.aruba.it/Program%20Files%20(x86)/Microsoft%20Visual%20Studio%209.0/VC/ce/atlmfc/include/atlctl.h

    所以我传递了me及nothing。

    我抽时间消化下你给的参考指引,这么详细应该能搞定了,再搞不定都真不大好意思再问你了.

    再次谢谢你的耐心回复!

    2014年3月17日 20:17
  • 还真是未能搞定,真不好意思。

    1、我下载你所给的代码后,编译得到类库Remotion.Dms.Clients.Windows.WebBrowserControl.dll

    2、构建windows窗体应用程序,添加ExtendedWebBrowser控件ExtendedWebBrowser1到Form1,当浏览
    网页并点击下载时,能实现截获IDownloadManager接口,但在代码(我稍为修改了下以便测试问题出在哪里):

    public IntPtr QueryService (ref Guid guidService, ref Guid riid, out IntPtr ppvObject)
           {
             
             ppvObject = IntPtr.Zero;
             if (            guidService == DownloadManagerGuids.SID_SDownloadManager && riid == DownloadManagerGuids.IID_IDownloadManager)
             {
                 MessageBox.Show ("IID_IDownloadManager");
                 if (_host.DownloadManager != null )
                 {
                 MessageBox.Show("IID_IDownloadManager");
               IDownloadManager downloadManagerImplementation = new DownloadManagerImplementation (_host.DownloadManager);
               ppvObject = Marshal.GetComInterfaceForObject (downloadManagerImplementation, typeof (IDownloadManager));
               return HResultValues.S_OK;
                 }
                 else
                      return HResultValues.E_NOINTERFACE;
             }
             else
               return HResultValues.E_NOINTERFACE;
           }


    的返回值为HResultValues.E_NOINTERFACE,即是说_host.DownloadManager == null,还是比较难理解如何传递参数给
    (_host.DownloadManager)或者说这个值是从哪里获取?

    3、我步骤2的测试方法可以吗?即可以这样使用这个类库Remotion.Dms.Clients.Windows.WebBrowserControl.dll吗?


    • 已编辑 zs李四 2014年3月18日 12:39
    2014年3月18日 12:36
  • 你不是要自定义一个下载管理器么?要自定义的话,自己创建一个然后赋值给_host.DownloadManager

    没有测试过这个类库,不过看起来代码没错的样子。



    Visual C++ MVP

    • 已建议为答案 zs李四 2014年3月19日 10:07
    2014年3月18日 14:43
    版主
  • 有点点理解了,不过接口对我来说还是比较难实现的东西。

    即我要定义个下载管理器,这个下载管理器具有接口:

    using System;
    namespace Remotion.Dms.Clients.Windows.WebBrowserControl
    {
      public interface IWebBrowserDownloadManager
      {
        bool OnStartDownload (Uri uri);
        bool OnProgress (int currentValue, int totalSize, string statusText);
        bool OnDataAvailable (byte[] buffer, int bytesAvailable);
        void OnDownloadCompleted (bool success, string statusText);
        void OnAborted ();
      }
    }

    然后将这个下载管理器赋值给_host.DownloadManager

    再次谢谢你!!


    搞定了,十分感谢。
    • 已编辑 zs李四 2014年3月19日 10:04
    2014年3月18日 23:20