anchor.diff:    Result := atCab;
     CabArchive := TAbCabArchive.Create(Fn, fmOpenRead or fmShareDenyNone);
     try
  -    CabArchive.LoadArchive;
  -  except
  -    on EAbFDICreateError do
  -      Result := atUnknown;
  +    try
  +      CabArchive.LoadArchive;
  +    except
  +      on EAbFDICreateError do
  +        Result := atUnknown;
  +    end;
  +  finally
  +    CabArchive.Free;
     end;
   end;
   
  
positive.code:       begin
          NewFilename := StrPas(pfdin^.psz1);
          if (NewFilename = Archive.FItemInProgress.FileName) then begin
            if not (eoRestorePath in Archive.ExtractOptions) then
              NewFilename := ExtractFileName(NewFileName);
            if (Archive.BaseDirectory <> '') then
              NewFilename := Archive.BaseDirectory + '\' + NewFilename;
            NewFilePath := ExtractFilePath(NewFilename);
            if (Length(NewFilePath) > 0 ) and
              (NewFilePath[Length(NewFilePath)] = '\') then
  
negative.code:   {extract a file from the cabinet}
  begin
    FItemInProgress := GetItem(Index);
    FIIPName := NewName;
    try
      if not FDICopy(FFDIContext, FCabName, FCabPath, 0, @FDI_ExtractFiles,
                     nil, Self) then
        DoProcessItemFailure(FItemInProgress, ptExtract, ecCabError, 0);
    finally
      FIIPName := '';
    end;
  end;
  {----------------------------------------------------------------------------}
  procedure TAbCabArchive.ExtractItemToStreamAt(Index : Integer; OutStream : TStream);
  