Форум: "Начинающим";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];
ВнизРабота с IStorage Найти похожие ветки
← →
Zalm © (2010-01-05 18:52) [0]Здравствуйте. Пытаюсь разбираться с IStorage. Читал в интернете статьи, но все они почти одинаковые. Создавать хранилище и записывать в него файл довольно просто:
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
Stg:IStorage;
Strm:IStream;
OS:TOleStream;
st : TFileStream;
begin
OleCheck (StgCreateDocfile ("Testing.stg",STGM_READWRITE or STGM_SHARE_EXCLUSIVE,0,Stg));
OleCheck (Stg.CreateStream ("Testing",STGM_READWRITE or STGM_SHARE_EXCLUSIVE,0,0,Strm));
OS:=TOleStream.Create (Strm);
try
st:=TFileStream.Create("D:\IStorage.exe",fmOpenRead);
OS.CopyFrom(st,st.Size);
finally
OS.free;
Strm:=nil;
Stg:=nil;
end;
end
А вот как достать из хранилища нужный файл? Это никак не получается, и в интернете примеров найти не удалось Подскажите пожалуйста как это сделать
← →
Демо © (2010-01-05 19:16) [1]
> Это никак не получается, и в интернете примеров найти не
> удалось
http://rouse.drkb.ru/files/storage.zip
← →
Zalm © (2010-01-05 21:54) [2]Спасибо, внушительный pas... А описания что да как нету у вас? а то там пару комментов и больше ничего нет... и функций и классов не мало..
← →
Демо © (2010-01-05 22:07) [3]
> Zalm © (05.01.10 21:54) [2]
Да вроде бы при реализации немного вопросов должно возникнуть.
Вот ещё ссылка для ознакомления:
http://www.firststeps.ru/mfc/activex/r.php?58
и далее по шагам...
← →
Zalm © (2010-01-05 22:08) [4]Спасибо пойду читать.
Но только подключил модуль к проекту хотел что-то попробовать, обнаружилось что GSUtils нету такого модуля вовсе
← →
Ганя (2010-01-06 12:24) [5]
> http://rouse.drkb.ru/files/storage.zip
Этот вариант не нужен.
> А вот как достать из хранилища нужный файл?
Все как в примере, только CopyFrom в обратную сторону. :-) Данный вопрос сводится не к работе со стораджем, а к работе со стримами
← →
Zalm © (2010-01-06 14:53) [6]Что-то я никак не соображу как написать это на делфи, вот нашел где это, только я в C++ не очень понимаю.
Данные из потока можно читать:HRESULT Read
(
void *pv, //указатель на буфер для записи
ULONG cb, //количество байтов для чтения
ULONG *pcbRead //количество действительно прочитанных байтов
);
Ошибок и кодов возврата может быть много. Если все нормально, то S_OK. Пример:hresult = pIStorage->OpenStream(L"MyFile", NULL,
STGM_READWRITE|STGM_DIRECT|STGM_SHARE_EXCLUSIVE,0, &stream);
if (!FAILED(hresult))
{
cout << "ok open file" << endl;
ULONG cb;
OLECHAR buffer[40];
hresult = stream->Read(&buffer,22 , &cb);
char buf[40];
wcstombs((CHAR*)&buf,(OLECHAR*)&buffer,sizeof(buf));
cout << buf << endl;
}
else cout << "error open file" << endl;
stream->Release();
pIStorage->Release()
Как правильно надо на делфи написать что бы файл считать?
← →
Zalm © (2010-01-06 17:29) [7]
procedure TForm1.SpeedButton6Click(Sender: TObject);
var
stream : IStream;
Enum:IEnumStatStg;
Size_: Int64;
Data:TStatStg;
St : byte;
begin
OleCheck(StgOPENStorage("Testing.stg",nil,STGM_READWRITE or STGM_SHARE_EXCLUSIVE,nil,0,stg));
OleCheck(Stg.EnumElements (0,nil,0,Enum));
while Enum.Next (1,Data,nil)=S_Ok do
if PChar(data.pwcsName)=Edit2.Text then
begin
Size_:=Data.cbSize;
Break;
end;
OleCheck(Stg.OpenStream(PChar(Edit2.Text),nil,STGM_READWRITE or STGM_SHARE_EXCLUSIVE,0,Stream));
OleCheck(Stream.Read(@st,1,nil)); {!!!}
end;
Почему всегда в результате ноль и ничего не прочитано? где я не правильно пишу?
← →
Ганя (2010-01-06 17:52) [8]
> Почему всегда в результате ноль и ничего не прочитано? где
> я не правильно пишу?
Отладчиком надо пройти, посмотреть, сколько элементов возвращается, какие у них имена - убедиться, что это вообще тот файл.
Кстати, конструкция
> if PChar(data.pwcsName)=Edit2.Text then
вызывает сомнения. Во что превратит этот код компилятор? в сравнение ссылок или содержимого? (я сам не уверен, а проверять негде)
← →
Zalm © (2010-01-06 18:17) [9]Искомый стрим в хранилище открывается без проблем, и размер верный. Проблема только в том что ничего не читается, всегда нули одни в буфере в том который указываю
← →
Ганя (2010-01-07 12:11) [10]
> OleCheck(Stream.Read(@st,1,nil)); {!!!}
То есть тут?
попробуй последним параметром передать не nil, и посмотреть, что там окажется
если окажется единичка, то значит в читаемом стриме и правда нуль первым байтом
← →
Zalm © (2010-01-07 14:19) [11]
procedure LoadFileFromStorageFile(FileName: string);
var Storage: IStorage;
Stream: IStream;
Buffer: array of byte;
p: PWideChar;
oles: TOleStream;
FileStream: TFileStream;
begin
try
p:=StringToOleStr(StorageFile);
OleCheck(StgOpenStorage(p,nil,STGM_DIRECT or STGM_READWRITE or STGM_SHARE_EXCLUSIVE,
nil,0, Storage));
try
p:=StringToOleStr(ExtractFileName(FileName));
OleCheck(Storage.OpenStream(p,nil,STGM_DIRECT or STGM_READWRITE or STGM_SHARE_EXCLUSIVE,
0,Stream));
try
oles:=TOleStream.Create(Stream);
try
FileStream:=TFileStream.Create(FileName,fmCreate);
try
FileStream.CopyFrom(oles,0);
finally
FileStream.Free;
end;
finally
oles.Free;
end;
finally
ReleaseObject(Stream);
end;
finally
ReleaseObject(Storage);
end;
finally
Buffer:=nil;
end;
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c