Форум: "Основная";
Текущий архив: 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