Конференция "Media" » Thumbs.db [WinXP]
 
  • multiflex (15.09.08 07:37) [0]
    Есть необходимость прочитать сабж. Никто не писал код на Delphi? Я понимаю все превосходство гугля, но он кроме с# кода и прочего, где используются _родные_LIB-ы_среды_ не дает. Хотелось хотябы заголовки узнать, а нарываюсь на код по использованию готовых классов. Может кто подскажет где прочитать,а? Спасибо.
  • Плохиш © (15.09.08 12:51) [1]
    Странно, я не поленился, спросил у яху и он мне в первой же ссылке пример с описанием на делфи выдал.
  • antonn © (15.09.08 14:44) [2]

    > Плохиш ©   (15.09.08 12:51) [1]

    ни в коем случае не говори какая ссылка
  • Sapersky (15.09.08 16:02) [3]
    Написано на основе C# ThumbDBLib by Gustavo Cerati.

    interface
    Uses windows, ActiveX, sysutils;

    function OpenThumbsStorage(Const FName : WideString; Size : PPoint = nil): Integer; // Возвращает кол-во тумбов
    function GetThumbData(Index : Integer; Out DataBuf : PByte): Integer;
    // В DataBuf возвращает данные (Jpeg), в Result размер.
    // После использования DataBuf нужно освободить! FreeMem(DataBuf);
    procedure CloseThumbsStorage;

    implementation

    Type
     TCatalogHeader = record
       Num1, Num2 : Word;
       thumbCount, thumbWidth, thumbHeight : Integer;
     end;

     TCatalogItem = record
       Num1 : Integer;
       ItemID : Integer;
       Num3, Num4, Num5, Num6 : Word;
    //    FName : PChar;
    //    Num7 : Word;
     end;

     TThumbItem = record
       Num1 : Integer;
       Index, Size : Integer;
     end;

     TThumbFile = record
       Name : String;
       ItemID : Integer;
     end;
     TThumbFileArr = array of TThumbFile;

    const
      MY_STGM_OPEN = STGM_DIRECT or STGM_SHARE_EXCLUSIVE or STGM_READWRITE;
      MY_STGM_CREATE = STGM_DIRECT or STGM_SHARE_EXCLUSIVE or STGM_READWRITE or STGM_CREATE;
      CLSID_NULL : TGUID = '{00000000-0000-0000-0000-000000000000}';

    Var
     ThumbStorage : IStorage;
     Thumbs : TThumbFileArr;

    function OpenThumbsStorage(Const FName : WideString; Size : PPoint = nil): Integer;
    Const
     CatalogName : WideString = 'Catalog';
    Var Hr : HResult;
       Stream : IStream;
       Hdr : TCatalogHeader;
       Item : TCatalogItem;
       Res : DWord;
       n, m : Integer;
       w : WideChar;
       Name : WideString;
    begin
    Result := 0; Finalize(Thumbs); ThumbStorage := nil;

    If (not FileExists(FName)) then Exit;

    Hr := StgIsStorageFile( PWideChar(FName) );
    If (Hr <> S_OK) then Exit;

    Hr := StgOpenStorage(  PWideChar(FName), nil, MY_STGM_OPEN,
                          nil, 0, ThumbStorage);

    If ( not SUCCEEDED( Hr ) ) then begin
     ThumbStorage := nil; Exit;
    end;

    Hr := ThumbStorage.OpenStream( PWideChar(CatalogName), nil, MY_STGM_OPEN,
                                  0, Stream);

    If (  not SUCCEEDED(  Hr  ) ) then begin
     Stream := nil; ThumbStorage := nil; Exit;
    end;

    Stream.Read(@Hdr, SizeOf(Hdr), @Res);

    If (Size <> nil) then begin
     Size.x := Hdr.thumbWidth; Size.y := Hdr.thumbHeight;
    end;

    SetLength(Thumbs, Hdr.thumbCount);

    For n:=0 to Hdr.thumbCount-1 do begin
     Stream.Read(@Item, SizeOf(Item), @Res);
     Name := '';
     Repeat
       Stream.Read(@w, 2, @Res);
       If (w <> #0) then Name := Name + w;
     Until (w = #0);
     Stream.Read(@w, 2, @Res);

     Thumbs[n].Name := Name;
     Thumbs[n].ItemID := Item.ItemID;
    end;
    Stream := nil;
    Result := Hdr.thumbCount;
    end;

    function GetThumbData(Index : Integer; Out DataBuf : PByte): Integer;
    Var n : Integer;
       Hr : HResult;
       Thumb : TThumbItem;
       Res : DWord;
       Stream : IStream;
       Name : WideString;
       s : String;
    begin
    Result := 0;
    If (ThumbStorage = nil) then Exit;
    If (Index < 0) or (Index >= Length(Thumbs)) then Exit;

    s := InttoStr(Thumbs[Index].ItemID);
    Name := '';
    Index := Length(s);
    For n:=1 to Index do
     Name := Name + s[Index-n+1];

    Hr := ThumbStorage.OpenStream( PWideChar(Name), nil, MY_STGM_OPEN,
                                   0, Stream);
    If (  not SUCCEEDED(  Hr  ) ) then begin
     Stream := nil; Exit;
    end;

    hr := Stream.Read(@Thumb, SizeOf(Thumb), @Res);
    If (hr = 0) and (Res = SizeOf(Thumb)) then begin
     GetMem(DataBuf, Thumb.Size);
     hr := Stream.Read(DataBuf, Thumb.Size, @Res);
     If (hr = 0) and (Res = Thumb.Size) then
       Result := Res
     else begin
       FreeMem(DataBuf); DataBuf := nil;
     end;
    end;
    end;

    procedure CloseThumbsStorage;
    begin
    Finalize(Thumbs); ThumbStorage := nil;
    end;
  • weidong (04.08.11 10:45) [4]
    study ,thanks
  • аа (05.05.12 14:19) [5]
    </CODE
    >
    > > <CODE><CODE><I>
    > > > <CODE><I><I><I><I

    ><

    I><

    I><I><I><

    U><I>>
    <CODE></CODE><CODE></CODE><U></U></U><I></I><B></B>
 
Конференция "Media" » Thumbs.db [WinXP]
Есть новые Нет новых   [118798   +30][b:0][p:0.001]