我用URLDownloadToFile下载文件,以前没问题的,但近来可能是服务器忙的原因,出问题了。
1 从网站下载下来的文件比实际小,但这个函数还是返回S_OK了,而从msdn看到,该函数返回值只有两个:
E_OUTOFMEMORY The buffer length is invalid or there was insufficient memory to complete the operation. 
S_OK The operation succeeded. 
难道这个函数在除了不够内存外都返回S_OK?
怎样才能判断出这个函数下载失败了?2 上次失败后,IE里面的缓存不是完整的文件,但再次运行URLDownloadToFile后程序却拿那个不完整的缓存来交货

解决方案 »

  1.   

    给你一个delphi的完整例子unit UnitUpdate;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      URLMon,ComCtrls, ActiveX;
    type
      TfrmUpdate = class(TForm,IBindStatusCallback)
        suiForm: TsuiForm;
        btnCancel: TdxButton;
        tmrUdapte: TTimer;
        suiFileTheme: TsuiFileTheme;
        plStatus: TPanel;
        plProgress: TPanel;
        Bevel1: TBevel;
        procedure btnCancelClick(Sender: TObject);
      private
        function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
        function GetPriority(out nPriority): HResult; stdcall;
        function OnLowResource(reserved: DWORD): HResult; stdcall;
        function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;szStatusText: LPCWSTR): HResult; stdcall;
        function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
        function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
        function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;stgmed: PStgMedium): HResult; stdcall;
        function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
        function GetHTMLFile(const URL, FileName: string): HRESULT;
      public
        { Public declarations }
      end;const
      BINDSTATUS_CONTENTDISPOSITIONATTACH = BINDSTATUS_LOADINGMIMEHANDLER + 1;
      BINDSTATUS_FILTERREPORTMIMETYPE     = BINDSTATUS_CONTENTDISPOSITIONATTACH + 1;
      BINDSTATUS_CLSIDCANINSTANTIATE      = BINDSTATUS_FILTERREPORTMIMETYPE + 1;
      BINDSTATUS_IUNKNOWNAVAILABLE        = BINDSTATUS_CLSIDCANINSTANTIATE + 1;
      BINDSTATUS_DIRECTBIND               = BINDSTATUS_IUNKNOWNAVAILABLE + 1;
      BINDSTATUS_RAWMIMETYPE              = BINDSTATUS_DIRECTBIND + 1;
      BINDSTATUS_PROXYDETECTING           = BINDSTATUS_RAWMIMETYPE + 1;
      BINDSTATUS_ACCEPTRANGES             = BINDSTATUS_PROXYDETECTING + 1;var
      frmUpdate: TfrmUpdate;
      DoCancel :Boolean=False;            //强制退出消息implementation
    uses
       IniFiles,Global,UnitDialog,UnitLanguage,FileName;
       
    {$R *.dfm}//------------------------------------------------------------------------------
    function TfrmUpdate.GetHTMLFile(const URL , FileName : string) : HRESULT;
    var
      status : IBindStatusCallback ;
    begin
      status := IBindStatusCallback(self);
      result := UrlDownLoadToFile(nil, pChar(URL) ,pChar(FileName),0 ,Status);
    end;//------------------------------------------------------------------------------
    function TfrmUpdate.GetBindInfo(out grfBINDF: DWORD;
      var bindinfo: TBindInfo): HResult;
    begin
       result := E_NOTIMPL;
    end;//------------------------------------------------------------------------------
    function TfrmUpdate.GetPriority(out nPriority): HResult;
    begin
       result := E_NOTIMPL;
    end;
      

  2.   

    //------------------------------------------------------------------------------
    function TfrmUpdate.OnDataAvailable(grfBSCF, dwSize: DWORD;
      formatetc: PFormatEtc; stgmed: PStgMedium): HResult;
    begin
       result := E_NOTIMPL;
    end;//------------------------------------------------------------------------------
    function TfrmUpdate.OnLowResource(reserved: DWORD): HResult;
    begin
       result := E_NOTIMPL;
    end;//------------------------------------------------------------------------------
    function TfrmUpdate.OnObjectAvailable(const iid: TGUID;
      punk: IInterface): HResult;
    begin
       result := E_NOTIMPL;
    end;//-----------------------------------------------------------------------------
    function TfrmUpdate.OnProgress(ulProgress, ulProgressMax,ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
    var
      Status:string;
    begin
        case ulStatusCode of
           BINDSTATUS_FINDINGRESOURCE                : Status:='Finding resource ' + szStatusText;
           BINDSTATUS_CONNECTING                     : Status:='Connecting to ' + szStatusText;
           BINDSTATUS_REDIRECTING                    : Status:='Redirecting...';
           BINDSTATUS_BEGINDOWNLOADDATA              : begin
                                                                    Status:='Start to download ' + szStatusText;
                                                                    //Animate.Active:=True;
                                                       end;
           BINDSTATUS_DOWNLOADINGDATA                : Status:='Downloading...';
           BINDSTATUS_ENDDOWNLOADDATA                : begin
                                                                    Status:='Complete downloading ' + szStatusText;
                                                                    //Animate.Active:=False;
                                                       end;
           BINDSTATUS_BEGINDOWNLOADCOMPONENTS        : Status:='Start to download components';
           BINDSTATUS_INSTALLINGCOMPONENTS           : Status:='Installing components...' ;
           BINDSTATUS_ENDDOWNLOADCOMPONENTS          : Status:='Complete downloading components';
           BINDSTATUS_USINGCACHEDCOPY                : Status:='Copying form buffer...';
           BINDSTATUS_SENDINGREQUEST                 : Status:='Sending request...';
           BINDSTATUS_CLASSIDAVAILABLE               : Status:='Class ID is available';
           BINDSTATUS_MIMETYPEAVAILABLE              : Status:='MIME type is available';
           BINDSTATUS_CACHEFILENAMEAVAILABLE         : Status:='Cache file name is available';
           BINDSTATUS_BEGINSYNCOPERATION             : Status:='Start sync operation';
           BINDSTATUS_ENDSYNCOPERATION               : Status:='Complete sync operation';
           BINDSTATUS_BEGINUPLOADDATA                : Status:='Start to upload data';
           BINDSTATUS_UPLOADINGDATA                  : Status:='Uploading data';
           BINDSTATUS_ENDUPLOADDATA                  : Status:='Complete Uploading data';
           BINDSTATUS_PROTOCOLCLASSID                : Status:='Protocol class ID is available';
           BINDSTATUS_ENCODING                       : Status:='Encoding...';
           BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE      : Status:='verified MIME is available';
           BINDSTATUS_CLASSINSTALLLOCATION           : Status:='Class install location';
           BINDSTATUS_DECODING                       : Status:='Decoding...';
           BINDSTATUS_LOADINGMIMEHANDLER             : Status:='Loading MIME handler';
           BINDSTATUS_CONTENTDISPOSITIONATTACH       : Status:='Content disposition attach';
           BINDSTATUS_FILTERREPORTMIMETYPE           : Status:='Filter report MIME type';
           BINDSTATUS_CLSIDCANINSTANTIATE            : Status:='Clsid can instantiate';
           BINDSTATUS_IUNKNOWNAVAILABLE              : Status:='Unknown available';
           BINDSTATUS_DIRECTBIND                     : Status:='Direct bind';
           BINDSTATUS_RAWMIMETYPE                    : Status:='MIME type of the resource, before any code sniffing is done';
           BINDSTATUS_PROXYDETECTING                 : Status:='Detecting proxy...';
           BINDSTATUS_ACCEPTRANGES                   : Status:='Valid types of range requests for a resource';
        end;    Application.ProcessMessages;    if DoCancel then
            result := E_ABORT
        else
            result := S_OK;    plStatus.Caption:=Status;
        plProgress.Caption:='Download :' +  IntToStr(ulProgress) +
                            '; Total : ' + IntToStr(ulProgressMax);end;//------------------------------------------------------------------------------
    function TfrmUpdate.OnStartBinding(dwReserved: DWORD;
      pib: IBinding): HResult;
    begin
       result := E_NOTIMPL;
    end;//------------------------------------------------------------------------------
    function TfrmUpdate.OnStopBinding(hresult: HResult;
      szError: LPCWSTR): HResult;
    begin
       result := E_NOTIMPL;
       if szError<>nil then
          Alert(WideCharToString(szError));
    end;//------------------------------------------------------------------------------
    procedure TfrmUpdate.btnCancelClick(Sender: TObject);
    begin
       DoCancel:=True;
       ModalResult:=mrCancel;
    end;
                                      
    end.