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

Вниз

structured storage   Найти похожие ветки 

 
Суслик ©   (2004-09-14 11:11) [0]

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

В настоящий момент я разбираюсь с технологией 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 16:27) [1]

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


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


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

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

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


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

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


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


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

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

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


 
Romkin ©   (2004-09-14 16:48) [5]

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


 
DiamondShark ©   (2004-09-14 16:57) [6]

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) [7]


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


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

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


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


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

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


 
DiamondShark ©   (2004-09-14 17:04) [9]


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

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


 
Rouse_ ©   (2004-09-14 17:04) [10]

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


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


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

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


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

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


 
Rouse_ ©   (2004-09-14 17:10) [12]

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


 
DiamondShark ©   (2004-09-14 17:12) [13]


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

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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.036 c
3-1117024134
Layner
2005-05-25 16:28
2005.07.11
Access+Insert в Delphi7, в ADOQuery.


8-1111160885
zhongguoren
2005-03-18 18:48
2005.07.11
tstringlist.create


14-1118152509
Valera
2005-06-07 17:55
2005.07.11
карта


6-1112681299
peppo
2005-04-05 10:08
2005.07.11
Коннект "решительно отвергается"


14-1118329934
Soft
2005-06-09 19:12
2005.07.11
Исполнитель желаний.