Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
2-1132214384
ASB
2005-11-17 10:59
2005.12.04
ODBC драйвер - ошибки


6-1125140900
NikNet
2005-08-27 15:08
2005.12.04
Как отправить письмо на почту Yandex через прокси?


14-1131755214
Мазут Береговой
2005-11-12 03:26
2005.12.04
Белорусская ОС - альтернатива Windows


2-1132174399
DillerXX
2005-11-16 23:53
2005.12.04
Передача данных из DLL в главный процесс


14-1131638145
PVOzerski
2005-11-10 18:55
2005.12.04
Россия - колыбель евронацизма?





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