Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.07;
Скачать: CL | DM;

Вниз

Работа с 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.011 c
15-1261561746
TUser
2009-12-23 12:49
2010.03.07
Россия 88


15-1261387411
Юрий Зотов
2009-12-21 12:23
2010.03.07
Регулярные выражения


15-1261389087
AntonioBanderas
2009-12-21 12:51
2010.03.07
Компонент "Линия"


2-1261572735
Shamansky
2009-12-23 15:52
2010.03.07
Access 2007 vs Delphi 2007


6-1211355931
lead-in
2008-05-21 11:45
2010.03.07
посылка сообщения в локальной сети