Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1261314553
DanweR
2009-12-20 16:09
2010.03.07
Демонстрация сортировки


1-1220526665
evgenij
2008-09-04 15:11
2010.03.07
узнать запущена моя программа или нет


2-1261744100
Who_is_you?
2009-12-25 15:28
2010.03.07
Процедура прерывания. В Delphi 7 pointer ?


10-1164542794
vlad-mal
2006-11-26 15:06
2010.03.07
Утечка памяти (объекты TConnectionPoints/TConnectionPoint )


15-1261561398
vv_fran
2009-12-23 12:43
2010.03.07
Нагрузка на проц от Delphi 7 в Win2003 Server





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский