![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Структурированное хранилище [D5]
ИМХО © (2004-07-20 16:26:00)Работаю с переменной типа 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;
Romkin (2004-07-21 18:22:00) [1]ИМХО © (21.07.04 18:08) [6] А, ну да. Для Storage - это SSView :)
Наверно :(
VMcL (2004-07-21 18:17:00) [2]>> ИМХО © (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;
ИМХО (2004-07-21 18:08:00) [3]А вы ничего не путаете? Скачал TIViewer, в тайтле у него - Type Information Viewerи открывает только exe-шники и dll-ки?
Romkin (2004-07-20 16:57:00) [4]http://archive.williamspublishing.com/cgi-bin/materials.cgi?isbn=5-8459-0074-3
Качай TIViewer, это просмотрщик хранилища
VMcL (2004-07-20 16:51:00) [5]>>ИМХО © (20.07.04 16:48) [3]
см. IStorage и иже с ним.
ИМХО (2004-07-20 16:48:00) [6]Да, что-то он говорит, сорри. На TStatStg он ничего не говорил.
Вообще проблема такая: есть файл, формат неизвестен, но известно, что это структурированное хранилище. Как можно вытащить оттуда внятную инфу?
VMcL (2004-07-20 16:40:00) [7]>>ИМХО © (20.07.04 16:26)
Что по поводу STATSTG говорит `F1`?
Анонимщик (2004-07-20 16:37:00) [8]А что объяснить, можно спросить?