Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Corba";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.04 c
14-1118266167
Megabyte
2005-06-09 01:29
2005.07.11
Хороший ФАК по FIB


1-1118890532
FDA
2005-06-16 06:55
2005.07.11
Как открыть файл AutoCAD?


6-1112600287
Mary
2005-04-04 11:38
2005.07.11
Как идентифицировать уведомление о прочтении ?


14-1118320625
Piter
2005-06-09 16:37
2005.07.11
Когда там у нас GTA: San Andreas появится?


14-1118294705
hooch
2005-06-09 09:25
2005.07.11
вопрос модераторам.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский