Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с IStorage


Zalm ©   (2010-01-05 18:52:00) 

Здравствуйте. Пытаюсь разбираться с 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


А вот как достать из хранилища нужный файл? Это никак не получается, и в интернете примеров найти не удалось Подскажите пожалуйста как это сделать


Zalm   (2010-01-07 14:19:00) [1]


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;


Ганя   (2010-01-07 12:11:00) [2]


> OleCheck(Stream.Read(@st,1,nil)); {!!!}


То есть тут?
попробуй последним параметром передать не nil, и посмотреть, что там окажется
если окажется единичка, то значит в читаемом стриме и правда нуль первым байтом


Zalm   (2010-01-06 18:17:00) [3]

Искомый стрим в хранилище открывается без проблем, и размер верный. Проблема только в том что ничего не читается, всегда нули одни в буфере в том который указываю


Ганя   (2010-01-06 17:52:00) [4]


> Почему всегда в результате ноль и ничего не прочитано? где
> я не правильно пишу?

Отладчиком надо пройти, посмотреть, сколько элементов возвращается, какие у них имена - убедиться, что это вообще тот файл.
Кстати, конструкция

> if PChar(data.pwcsName)=Edit2.Text then

вызывает сомнения. Во что превратит этот код компилятор? в сравнение ссылок или содержимого? (я сам не уверен, а проверять негде)


Zalm   (2010-01-06 17:29:00) [5]


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;

Почему всегда в результате ноль и ничего не прочитано? где я не правильно пишу?


Zalm   (2010-01-06 14:53:00) [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


Ганя   (2010-01-06 12:24:00) [7]


> http://rouse.drkb.ru/files/storage.zip


Этот вариант не нужен.


> А вот как достать из хранилища нужный файл?


Все как в примере, только CopyFrom в обратную сторону. :-) Данный вопрос сводится не к работе со стораджем, а к работе со стримами


Zalm   (2010-01-05 22:08:00) [8]

Спасибо пойду читать.
Но только подключил модуль к проекту хотел что-то попробовать, обнаружилось что GSUtils нету такого модуля вовсе


Демо   (2010-01-05 22:07:00) [9]


> Zalm ©   (05.01.10 21:54) [2]


Да вроде бы при реализации немного вопросов должно возникнуть.
Вот ещё ссылка для ознакомления:

http://www.firststeps.ru/mfc/activex/r.php?58
и далее по шагам...


Zalm   (2010-01-05 21:54:00) [10]

Спасибо, внушительный pas... А описания что да как нету у вас? а то там пару комментов и больше ничего нет... и функций и классов не мало..


Демо   (2010-01-05 19:16:00) [11]


> Это никак не получается, и в интернете примеров найти не
> удалось


http://rouse.drkb.ru/files/storage.zip


Наверх

Титульная страница Поиск, карта сайта Написать письмо