Главная страница
    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.033 c
1-1090238785
artem123
2004-07-19 16:06
2004.08.01
Как найти компонент на форме незная имени..


14-1089895407
gn
2004-07-15 16:43
2004.08.01
Утвержден стандарт безопасности Wi-Fi


3-1089140159
Zhekson
2004-07-06 22:55
2004.08.01
Фильтрация по полю второстепенной таблицы.


9-1081859786
Goorus
2004-04-13 16:36
2004.08.01
3D колизии


14-1089887417
vecna
2004-07-15 14:30
2004.08.01
Расшифровка протеста





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