![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
Привет. Задача такая. Нужно хэндл произвольного типа (доступный для DuplicateHandle(): пайп, файл, событие, HPROCESS...) поделить между процессами.
Зарегистрировать его под уникальным именем, а другой процесс зная это имя может получить валидный для себя хэндл того же объекта. Как можно это сделать? COM Server использовать нельзя. Может есть простой способ? Или есть готовая реализация? Есть мысль с помощью MapViewOfFile(Filename:= NULL) выделить именованный блок виртуальной памяти, и в него писать таблицу struct { SomeProcessInfo pifo; HANDLE hndl; }[]; С помощью мутексов синхронизировать доступ к этой таблице из разных процессов. Когда процесс впервые получает хэндл из этой таблицы, он сам записывает в неё информацию о себе, так что если первый процесс (тот, кто создал объект) завершается, объект остаётся доступным. А когда все процессы завершаются, система освобождает таблицу и хэндлы из неё. |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
лучше уточнить вопрос: "какие существуют способы физической передачи дескрипторов между процессами", т.е. как передать дескриптор из одного процесса в другой, поскольку поделить доступ к дескриптору - это как раз задача для DuplicateHandle, которая в вопросе уже присутствует
leniviy, я правильно понял вопрос? -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
да. Нужен способ , когда оба процесса знают имя.
|
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
Способов, в принципе множество, FileMapping - один из них, и вполне преемлемый
Если не хочешь FileMapping, то можно использовать посылку оконных сообщений между процессам (конечно, в случае, когда приложения оконные), RegisterWindowMessage гарантирует уникальность сообщения в таком случае если такой возможности нет, то можно использовать общую секцию данных (мы, кстати совсем недавно обсуждали такой способ): в случае, когда процессы отображаются из одного образа, создаешь секцию в приложении и выделяешь в ней связные переменные
которая будет доступна из всех процессов в случае, когда образы разные - делай то же самое в какой-нибудь dll, импортируя ее в свои приложения выбирай, что лучше подходит для твоей задачи вобщем-то, синхронизировать здесь и нечего, поскольку синхронизация необходима только при динамических изменениях объекта, к которому в момент перераспределения могут иметь доступ другие прцессы это свойственно в основном для объектов в памяти, ссылка на которые и выделяется в общий доступ, но, поскольку между процессами виртуальная память не делится, то указатели здесь, в принципе, не могут быть общими, поэтому обращай внимание на то, какой тип информации хранится в SomeProcessInfo, и следи, чтобы там не было ссылок на данные вне общей секции и любые дескрипторы, актуальные исключительно в текущем процессе. Это сообщение отредактировал(а) GremlinProg - 22.12.2008, 17:08 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: 1 Всего: 5 |
GremlinProg, спасибо. Про #pragma data_seg(".shared") интересно.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |