Форум: "Основная";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
ВнизСовместное чтение/запись из стораджа (IStorage) Найти похожие ветки
← →
jack128 © (2005-11-09 13:41) [0]День добрый. Есть Compound File к которому нужно иметь доступ из нескольких приложений, при это одно приложение должно иметь возможность писать. Сосбсвенно вопрос, с какими флагами стороджи и стримы нужно открывать, чтобы получить такую возможность?
Я кое что наваял.. Не работающее..var
Storage: IStorage;
_Stream: Istream;
begin
StorageFlags := STGM_DIRECT_SWMR or STGM_READWRITE or STGM_SHARE_DENY_WRITE; //STGM_SHARE_EXCLUSIVE - если корень Storage"а открыты монопольно, то все работает
OleCheck(StgOpenStorage(PWideChar(WideString(fn)), nil, StorageFlags, nil, 0, Storage));
OleCheck(Storage.OpenStream("test_stream", nil, STGM_READWRITE or STGM_DIRECT_SWMR or STGM_SHARE_EXCLUSIVE, 0, _Stream)); // Если открыть с флагом STGM_SHARE_DENY_WRITE , то ошибка "неверный флаг"
s := Memo1.Lines.Text;
OleCheck(_Stream.Write(PChar(s), Length(s), @Dummy)) // А тут ошибка - Отказано в доступе, хотя с этим файлом только теущее приложение работает..
end;
← →
jack128 © (2005-11-09 13:46) [1]jack128 © (09.11.05 13:41)
то все работает
Имеется в виду, что данные пишутся.. Но меня монопольный доступ не устраивает..
Еще уточнение, если важно. Пишущим приложением всегда открыт корневой сторадж, а подстораджы и стримы открываются переодически и очень быстро закрываются..
← →
Набережных С. © (2005-11-09 14:22) [2]Такова системная реализаций. Поищи в MSDN топик Compound File Implementation или как-то так, там сказано.
Для IStorage и Istream есть маршалеры, можно попробовать открывать в одном приложении и раздавать интерфейсы остальным. Я не пробовал.
← →
jack128 © (2005-11-09 15:20) [3]Мда. Понятно. Спасибо за наводку.
Если кому интересно писать нужно так:type
IDirectWriterLock = interface(IUnknown)
["{0E6D4D92-6738-11CF-9608-00AA00680DB4}"]
function WaitForWriteAccess(dwTimeout: DWORD): HRESULT; stdcall;
function ReleaseWriteAccess(): HRESULT; stdcall;
function HaveWriteAccess(): HRESULT; stdcall;
end;
procedure TForm1.WriteDataButtonClick(Sender: TObject);
var
s: string;
Dummy: Int64;
_Stream: IStream;
Lock: IDirectWriterLock;
begin
OleCheck(Storage.QueryInterface(IDirectWriterLock, Lock));
OleCheck(Lock.WaitForWriteAccess(1000)); // Пытаемся блокируем ресурс. Если в этот момент кто то держит сторадж открытым, то мы обламываемся..
OleCheck(Storage.OpenStream("test_stream", nil, STGM_READWRITE or
STGM_DIRECT_SWMR or STGM_SHARE_EXCLUSIVE, 0, _Stream)); // Сейчас никто не может открыть файл Storage"а.
s := Memo1.Lines.Text;
OleCheck(_Stream.Write(PChar(s), Length(s), @Dummy)) ; // А мы спокойно пишем данные.
OleCheck(Lock.ReleaseWriteAccess); // снимаем блокировку.
end;
Таким образом _одновременно_ можно только читать данные, а чтобы писать в файл, нужно отключить всех читателей
← →
Игорь Шевченко © (2005-11-09 16:21) [4]jack128 © (09.11.05 15:20) [3]
Нет, чтобы базу данных использовать...:)
← →
jack128 © (2005-11-09 16:26) [5]Игорь Шевченко © (09.11.05 16:21) [4]
В данном вопросе мое мнение не было решающим..
← →
Digitman © (2005-11-09 16:28) [6]
> Игорь Шевченко © (09.11.05 16:21) [4]
Игорь, ты не прав) ...
В ряде офисного характера задач на лок.хосте оч даже удобно использовать именно сторэджи ... хотя бы потому что движок для них встроен в систему.
← →
Игорь Шевченко © (2005-11-09 16:28) [7]jack128 © (09.11.05 16:26) [5]
А написать одно приложение, которое будет разруливать запросы к Stogare тоже не судьба ?
← →
Игорь Шевченко © (2005-11-09 16:30) [8]Digitman © (09.11.05 16:28) [6]
Охотно верю. Но при этом приложение желательно иметь одно, работающее с конкретным Storage :) Чтобы не было ситуаций для "выгона всех читателей". Ворд ведь тоже предлагает режим "только чтение" или "уведомить", если с документов кто-то работает.
← →
Digitman © (2005-11-09 16:32) [9]
> Ворд ведь тоже предлагает режим "только чтение" или "уведомить",
> если с документов кто-то работает
У тебя есть что-то против Ворда ?
Ворд ведь именно со сторэджами работает ..
← →
Leonid Troyanovsky © (2005-11-09 17:19) [10]
> jack128 © (09.11.05 15:20) [3]
> Таким образом _одновременно_ можно только читать данные,
> а чтобы писать в файл, нужно отключить всех читателей
Поэтому оно и зовется SWMR.
Кста, писатель и читатели должны открывать его по-разному,
STGM_DIRECT_SWMR | STGM_READWRITE | STGM_SHARE_DENYWRITE
and each of the readers opens the object with these flags:
STGM_DIRECT_SWMR | STGM_READ | STGM_SHARE_DENY_NONE
--
Regards, LVT.
← →
jack128 © (2005-11-09 17:42) [11]Игорь Шевченко © (09.11.05 16:28) [7]
А написать одно приложение, которое будет разруливать запросы к Stogare тоже не судьба ?
Не судьба ;) Сравни - пяток строк кода и свой сервер. Если бы мне MWMR нужен был, то написал бы сервер, а так - нафиг надо.
Leonid Troyanovsky © (09.11.05 17:19) [10]
Поэтому оно и зовется SWMR.
Ну может быть. Хотя я не понимаю, зачем выгонять всех читателей.. Достаточно запретить им читать на время, вот и все..
← →
Игорь Шевченко © (2005-11-09 22:57) [12]
> Сравни - пяток строк кода и свой сервер
Парьтесь :) Ты же не первый, кто этот вопрос задает :) Двоим уже был дан аналогичный совет, относительно базы данных или сервера, надеюсь, их имена тебе известны :)
Digitman © (09.11.05 16:32) [9]
>
> У тебя есть что-то против Ворда ?
Против Ворда у меня ничего нету. Против нескольких Вордов, работающих с одним документом, у меня уже есть чего :)
← →
Суслик © (2005-11-10 11:07) [13]
> Ну может быть. Хотя я не понимаю, зачем выгонять всех читателей..
> Достаточно запретить им читать на время, вот и все..
думаю, что это зависит от деталей того, что ты пишешь.
Вот представь, что читель читал некий объем данных (некую структуру), который должен восприниматься атомарно. Т.е. либо целиком прочел либо целиком не прочел. Если прервешь читателя в середине чтения, то он может дочитать не то, что начал читать. Т.е. нужно перерывать в момент окончания связанного чтения.
Конечно, если у тебя чтение структуры состоит из одного физического чтения, то тебе об этом задумываться не надо.
← →
Digitman © (2005-11-10 11:34) [14]
> Игорь Шевченко © (09.11.05 22:57) [12]
ну , положим, офисные задачи - это далеко не только задачи , относящиеся к назначению и функциональности упомянутого Ворда
мало ли для каких приложений офисного (да и не только) характера, в т.ч. неинтерактивных, может потребоваться конкурентный доступ к сторэджу..
← →
Игорь Шевченко © (2005-11-10 11:42) [15]Digitman © (10.11.05 11:34) [14]
Вот и я насчет конкурентного доступа тоже. В случае конкурентного доступа (подразумевающего не только чтение), вроде бы давно придумали схему, когда доступ реализуется одним приложением, которое собирает запросы с клиентов и распределяет их так, чтобы клиенты своими запросами друг другу не мешали.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.043 c