Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Структурированное хранилище [D5]


ИМХО ©   (2004-07-20 16:26:00) 

Работаю с переменной типа TStatStg.

Кто-нить может мне объяснить эту структуру:

 tagSTATSTG = record
   pwcsName: POleStr;
   dwType: Longint;
   cbSize: Largeint;
   mtime: TFileTime;
   ctime: TFileTime;
   atime: TFileTime;
   grfMode: Longint;
   grfLocksSupported: Longint;
   clsid: TCLSID;
   grfStateBits: Longint;
   reserved: Longint;
 end;


Romkin   (2004-07-21 18:22:00) [1]

ИМХО ©  (21.07.04 18:08) [6] А, ну да. Для Storage - это SSView :)
Наверно :(


VMcL   (2004-07-21 18:17:00) [2]

>> ИМХО ©  (20.07.04 16:48) [3]

Вот выкусил отрывок с одной из своих тестовых "аппликаций" (там встречаются функции из нестандартных модулей - можно выкинуть или заменить на свои по смыслу):

procedure TAppForm.DoReadCF(const AFile: WideString);
const
 ReadMode = stgm_Read + stgm_Share_Exclusive + stgm_Direct;
var
 RootStg: IStorage;
 BaseDir, Dir: String;

 procedure RecurseStg(const AStg: IStorage);
 var
   Stm: IStream;
   SavDir: String;
   Enum: IEnumStatStg;
   Stat: TStatStg;
   Mem: TMemoryStream;
   OS: TOleStream;
   Name, FName: String;
   Stg: IStorage;
 begin
   AddAutoBkSl(Dir);
   Res := AStg.EnumElements(0, nil, 0, Enum);
   CheckRes;

   Enum.Reset;
   while Enum.Next(1, Stat, nil) = S_OK do
   begin
     Name := String(Stat.pwcsName);
     case Stat.dwType of
       stgty_Storage: begin
                        SavDir := Dir;
                        Dir := Dir + Name + '\';
                        ForceDirectories(Dir);
                        Res := AStg.OpenStorage(Stat.pwcsName, nil,
                          ReadMode, nil, 0, Stg);
                        CheckRes;

                        RecurseStg(Stg);
                        Dir := SavDir;
                      end;
       stgty_Stream:  begin
                        Res := AStg.OpenStream(Stat.pwcsName, nil,
                          ReadMode, 0, Stm);
                        CheckRes;
                        //AddLog(Format('%s', [Stat.pwcsName]));

                        FName := TrimPlus(Dir + Name);
                        FileSetAttr(FName, faArchive);

                        OS := TOleStream.Create(Stm);
                        Mem := TMemoryStream.Create;
                        try
                          Mem.LoadFromStream(OS);
                          Mem.SaveToFile(FName);
                        finally
                          Mem.Free;
                          OS.Free;
                        end;
                      end;
     else
       AddLog(Format(#32'* Unexpected resource "%s" (type %d).', [Name, Stat.dwType]));
     end;
   end;
 end;

begin
 if AFile = '' then Exit;

 if LogMemo.Lines.Count > 0 then AddLog('');
 AddLog(Format('Processing file "%s"...', [AFile]));

 if StgIsStorageFile(PWideChar(AFile)) <> S_OK then
 begin
   xMsgDlgEx(Format('"%s" is not a compound file.', [AFile]),
     '', mtErr, [mbOK], Self);
   Exit;
 end;

 BaseDir := AFile + '.StorageStructure\';
 ForceDirectories(BaseDir);
 if not DirectoryExists(BaseDir) then
 begin
   DirError(BaseDir);
   Exit;
 end;

 Res := 0;
 try
   Res := StgOpenStorage(PWideChar(AFile), nil, ReadMode, nil, 0, RootStg);
   CheckRes;

   Dir := BaseDir;
   RecurseStg(RootStg);
 except
   if Res <> 0 then
     xMsgDlgEx(Format('Error %.8Xh.', [Res]), '', mtErr, [mbOK], Self);
   Exit;
 end;

 AddLog(Format('Structure for file "%s" successfully created.', [AFile]));
 xMsgDlgEx('Structure successfully created.', '', mtInfo, [mbOK], Self);
end;


ИМХО   (2004-07-21 18:08:00) [3]

А вы ничего не путаете? Скачал TIViewer, в тайтле у него - Type Information Viewerи открывает только exe-шники и dll-ки?


Romkin   (2004-07-20 16:57:00) [4]

http://archive.williamspublishing.com/cgi-bin/materials.cgi?isbn=5-8459-0074-3
Качай TIViewer, это просмотрщик хранилища


VMcL   (2004-07-20 16:51:00) [5]

>>ИМХО ©  (20.07.04 16:48) [3]

см. IStorage и иже с ним.


ИМХО   (2004-07-20 16:48:00) [6]

Да, что-то он говорит, сорри. На TStatStg он ничего не говорил.

Вообще проблема такая: есть файл, формат неизвестен, но известно, что это структурированное хранилище. Как можно вытащить оттуда внятную инфу?


VMcL   (2004-07-20 16:40:00) [7]

>>ИМХО ©  (20.07.04 16:26)

Что по поводу STATSTG говорит `F1`?


Анонимщик   (2004-07-20 16:37:00) [8]

А что объяснить, можно спросить?


Наверх

Титульная страница Поиск, карта сайта Написать письмо