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

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

structured storage [D6, Win2k]


Суслик ©   (2004-09-14 11:11:00) 

Уважаемые мастера.

В настоящий момент я разбираюсь с технологией structured storage.
Т.к. эта тематика описана в разделе MSDN Component developing, то задаю вопрос в конференции по COM.

Как создать поток (stream), когда хранилище (storage) открыто в режиме STGM_SIMPLE.

var
  kHResult: HRESULT;
  kStorage: IStorage;
  kStream: IStream;
begin
  // здесь я поставил флаги по MSDN и по Хармону - у него это явно написано.
  kHResult := StgCreateDocfile(
     'd:\temp\aaa',
     STGM_DIRECT or STGM_SIMPLE or STGM_READWRITE or STGM_CREATE or STGM_SHARE_EXCLUSIVE,
     0,
     kStorage);

  if Failed(kHResult) then
  begin
     raise Exception.CreateFmt('fail to create storage (error $%.8x)', [kHResult]);
  end;

  // Но! Я не нашел, где сказано с какими флагами открыать потоки :((
  // Если с теми же, то ошибка на этой строке: STG_E_INVALIDFLAG = HRESULT($800300FF);
  // Я пробовал разные (не все комбинации, правда) - все равно такая ошибка.
  kHResult := kStorage.CreateStream(
     'Workbook',
     STGM_DIRECT or STGM_SIMPLE or STGM_READWRITE or STGM_CREATE or STGM_SHARE_EXCLUSIVE,
     0,
     0,
     kStream);
  if Failed(kHResult) then
  begin
     raise Exception.CreateFmt('fail to create stream (error $%.8x)', [kHResult]);
  end;
end;


Заранее благодарен за ответ


Суслик   (2004-09-14 17:27:00) [1]


> [13] DiamondShark ©   (14.09.04 17:12)

а что же ты сначал стал делать?
Доку читать?
Про создание потока в режиме simple я не видел никакого описания.


DiamondShark   (2004-09-14 17:12:00) [2]


> Суслик ©   (14.09.04 17:07) [11]

Я ж не сразу кинулся флаги переставлять.


Rouse_   (2004-09-14 17:10:00) [3]

> Суслик ©   (14.09.04 17:07) [11]
Хм, я без этого режима работаю, все равно есть выравнивание по 512 байт


Суслик   (2004-09-14 17:07:00) [4]


>  [10] Rouse_ ©   (14.09.04 17:04)

Экспорт в biff8
Я не понял точно, но как мне кажется ексель пользуется именно режимом simplе (т.е. поток workbook всегда кратен 4кб). Опять же я не понял критично ли для него при чтении, чтобы файл был кратен 4кб или нет. Т.е. это все для перестраховки - хочется сделать как можно ближе к тому, что сохраняет сам ексель.


>  [9] DiamondShark ©   (14.09.04 17:04)

Повезло.
Тоже перебирал, перебирал - на этот вариант так и не попал :)))


DiamondShark   (2004-09-14 17:04:00) [5]


> Суслик ©   (14.09.04 17:01) [8]

Перебором.
Но попал с первого раза :)


Rouse_   (2004-09-14 17:04:00) [6]

Просто интересно, а для чего используешь STGM_SIMPLE?
Теряешь ведь в возможностях...


Суслик   (2004-09-14 17:01:00) [7]


>  [6] DiamondShark ©   (14.09.04 16:57)

Премного благодарен :)))
Ты эту комбинацию флагов:
1) нашел перебором
2) прочел где (укажи, если не сложно)


DiamondShark   (2004-09-14 16:57:00) [8]

var
 kStorage: IStorage;
 kStream: IStream;
begin
 OleCheck( StgCreateDocfile(
    'zzz.stg',
    STGM_SIMPLE or STGM_CREATE or STGM_READWRITE or STGM_SHARE_EXCLUSIVE,
    0,
    kStorage) );

 OleCheck( kStorage.CreateStream(
    'Workbook',
    STGM_READWRITE or STGM_SHARE_EXCLUSIVE,
    0,
    0,
    kStream) );
end;


Суслик   (2004-09-14 16:57:00) [9]


>  [5] Romkin ©   (14.09.04 16:48)


> У хранилища в первую очередь :)

Если я уберу simple у хранилища, но оставлю у потока, то создаваемые потоки не будут кратны 4кб (что есть признак того, что поток создан в режиме simple) - они остаются того размера, сколько в них записано. Из чего я делаю вывод, что с этом случае режим simple не установился.


Romkin   (2004-09-14 16:48:00) [10]

У хранилища в первую очередь :)


Суслик   (2004-09-14 16:36:00) [11]


>  [3] Гаврила ©   (14.09.04 16:31)
> Ну так я и говорю - попробуй только STGM_SHARE_EXCLUSIVE

Не помогает
kStorage.CreateStream(
    'Workbook',
    STGM_SHARE_EXCLUSIVE,
    0,
    0,
    kStream);

Все равно дает ту же саму ошибку.


Гаврила   (2004-09-14 16:31:00) [12]

Ну так я и говорю - попробуй только STGM_SHARE_EXCLUSIVE


Суслик   (2004-09-14 16:28:00) [13]


>  [1] Гаврила ©   (14.09.04 16:27)

У меня получается создать хранилище, но не получается создать поток.

я не понял твоего ответа :((


Гаврила   (2004-09-14 16:27:00) [14]

Насколько я знаю ,системная реализация поддерживает ТОЛЬКО эксклюзивное открытие


Наверх

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