Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
ИМХО ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.029 c
6-1086080566
NorthMan
2004-06-01 13:02
2004.08.01
про IdTCPServer


14-1090057824
Baron
2004-07-17 13:50
2004.08.01
Опрос и обсуждение.


1-1089896858
faost
2004-07-15 17:07
2004.08.01
StringGrid+ComboBox?


14-1089964830
Dmitriy O.
2004-07-16 12:00
2004.08.01
Референдум


1-1090299020
999
2004-07-20 08:50
2004.08.01
progressbar.create





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский