Главная страница
    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.03 c
1-1090248783
serg128
2004-07-19 18:53
2004.08.01
как в TTreeView получить родительский узел?


3-1089011530
CAMCOH
2004-07-05 11:12
2004.08.01
Проблемка с dbGrid


1-1089936646
AlexR
2004-07-16 04:10
2004.08.01
Как отследить мессадж WM_KeyDown при редактировании Edita


1-1089976174
nastya
2004-07-16 15:09
2004.08.01
печать в QuickRep


14-1089790623
ruslan
2004-07-14 11:37
2004.08.01
u menya est funksiya kak ispolzovat vipolnyat eqo





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