Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

Структурированное хранилище   Найти похожие ветки 

 
ИМХО ©   (2004-07-20 16:26) [0]

Работаю с переменной типа 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;


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

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


 
VMcL ©   (2004-07-20 16:40) [2]

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

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


 
ИМХО ©   (2004-07-20 16:48) [3]

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

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


 
VMcL ©   (2004-07-20 16:51) [4]

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

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


 
Romkin ©   (2004-07-20 16:57) [5]

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


 
ИМХО ©   (2004-07-21 18:08) [6]

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


 
VMcL ©   (2004-07-21 18:17) [7]

>>ИМХО ©  (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;


 
Romkin ©   (2004-07-21 18:22) [8]

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.034 c
4-1087458441
WwW
2004-06-17 11:47
2004.08.01
Мастера есть функция котораея определяет Handle активного окна


3-1089196035
AlexanderSK
2004-07-07 14:27
2004.08.01
Удаление первичного ключа


1-1090243039
Natalie_Q
2004-07-19 17:17
2004.08.01
Из Delphi в HTML


4-1087542518
Тимохов
2004-06-18 11:08
2004.08.01
CreateRemoteThread


1-1089849388
Глеб
2004-07-15 03:56
2004.08.01
Прорисовка и скроллинг изображения