Главная страница
    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.47 MB
Время: 0.098 c
3-1089023762
metrol
2004-07-05 14:36
2004.08.01
Считывание ОЛЕ с базы


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


4-1087571840
alex870
2004-06-18 19:17
2004.08.01
Стили окна


3-1089014270
Ky3bka
2004-07-05 11:57
2004.08.01
Двоеточие в удаленной процедуре


1-1089991635
ko
2004-07-16 19:27
2004.08.01
color





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский