![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Насколько я знаю ,системная реализация поддерживает ТОЛЬКО эксклюзивное открытие