Search
Write a publication
Pull to refresh

Comments 6

Спасибо за ссылку на сайт «Мастера Дельфи». Столько полезного в своё время там нашёл! Прям вспомнились школьные годы, дорогущий интернет по-модему, те самые звуки хр-хр-хрх-уиу-уиу-хррр. Эхх…
Спасибо за статью, огромный труд!
Благодаря статье, я теперь знаю о составных файлах, думаю применю где-нибудь.
Добрый день!
В своей статье вы не упомянули методы ReadClassStg/WriteClassStg, позволяющие подписывать файл уникальным GUID. Почему?
Я в своей программе, использующей, OLE хранилища, не использовал метод Commit. И тфу-тьфу, пока не получил битых файлов (конечно, у меня статистика использования программы не такая большая как у Вас). Метод Commit нужно вызывать перед обнуление корневого хранилища или после каждой операции записи?

Например:
<code class="delphi">procedure WriteInt(V: integer; const Name: WideString; var Storage: IStorage);
var
  BytesWritten: Integer;
  Stream: IStream;
begin
  Olecheck(Storage.CreateStream(PWideChar(Name),
    STGM_CREATE or STGM_WRITE or STGM_DIRECT or STGM_SHARE_EXCLUSIVE,
    0, 0, Stream));
  try
    Olecheck(Stream.Write(@V, sizeof(Integer), @BytesWritten));
    // ?? Olecheck(Storage.Commit(STGC_DEFAULT))
  finally
    Stream := nil
  end
end;
</code>


Спасибо за статью!
ReadClassStg/WriteClassStg я упомянул в декларации заголовка, но сам их не использую (не было надобности).
А по поводу вызова Commit — к сожалению не на всех машинах происходит автоматическая запись данных, но закономерности я не понял, поэтому всегда вызываю его принудительно, во избежание :)
Ну а вызывать его в принципе нужно один раз, перед закрытием хранилища, вызвав его для рута.
А я использую ReadClassStg/WriteClassStg как уникальный флаг что это это «мои» файлы :)
К сожалению не достаточно кармы что бы проголосовать за статью :\.
Данное поле предназначено немного для других вещей:
msdn.microsoft.com/ru-ru/library/windows/desktop/ms862136.aspx
Но, в принципе, если не будете пересекаться по UID с существующими врапперами над стораджем — можно и так вывернуться. Просто там в заголовке есть резервируемые поля, я бы, для данных целей воспользовался хотя-бы _ulReserved2
Sign up to leave a comment.

Articles