|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
16.04.2013, 02:32 | #1 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
File Mapping
Посмотрел все, что поиск по форуму дал на "File Mapping", но решения так и не нашел. У меня проблема вот в чем: нужно создать буфер для обменна данными между несколькими процессами. Когда главный процес создает и проецирует файл в область памяти, то он может производить и чтение и запись. А вот подчиненные процесы могут делать только чтение. При таком раскладе как у меня(см. код ниже) подчиненный процес, который пытается сделать отображение получает NULL, а GetLastError дает 0x05 - доступ запрещен.
вот код главного процесса: Код:
Код:
Код:
Последний раз редактировалось lowercase; 16.04.2013 в 02:35. |
16.04.2013, 07:55 | #2 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Вообще-то это нормальная ситуация, когда совместно используемые данные может писать, максимум, один процесс.
Что Вас не устраивает? Если нужен двусторонний обмен, используйте два разных файла. |
16.04.2013, 11:54 | #3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Два процесса спокойно могут писать в одну и ту же память. Другое дело, что они с там будут делать...
Вопрос, почему в одном MapViewOfFile() указывается размер а в другом нет? Далее, оба процесса под одной учетной записью или нет? Если один администратор а другой обычный могут быть проблемы, хотя я лично никогда не пробовал такой вариант. |
16.04.2013, 12:23 | #4 | |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
во втором случае указан 0 потому, что в описании указано
Цитата:
да. все процессы запускаються от имени администратора. |
|
16.04.2013, 16:48 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
|
16.04.2013, 17:53 | #6 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
Не так уж и долго как кажется. Просто размер буфера задается только в главном процесе. Это я его только для тестирования сразу в buffer_size установил. Оно работает, если подчиненный процесс сделает вызов MapViewOfFile c флагом FILE_MAP_READ или FILE_MAP_COPY. То есть, от главного процесса принимаются данные - работает нормально. Но мне нужна знапись из подчененного, которая при вызове MapViewOfFile с флагом FILE_MAP_WRITE(FILE_MAP_ALL_ACCESS) почему не дает ожидаемого результата.
Последний раз редактировалось lowercase; 16.04.2013 в 21:02. |
16.04.2013, 18:00 | #7 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
Не знаю на сколько это поможет. Но всетаки отмечу, что доступ к отражению файла в памяти будет монопольным - в один момент времени только один процесс может производить чтение или запись. Остальные ждут. Буду синхронизировать с помощью мютексов. Но мне сейчас главное сделать возможным чтение и запись данных в буфер из любого процесса.
Последний раз редактировалось lowercase; 16.04.2013 в 21:03. |
17.04.2013, 01:35 | #8 |
Пользователь
Регистрация: 15.05.2010
Сообщений: 88
|
вот же банальщина - не ту константу передал в OpenFileMapping. вместо PAGE_READWRITE надо FILE_MAP_ALL_ACCESS.
с ума сойти можно: два дня не мог понять в чем проблема. весьма веселые грабли! случайно наткнулся на статью Создание именованной, совместно используемой памяти которая решила все мои беды (ну почти все) Последний раз редактировалось lowercase; 17.04.2013 в 01:38. |
17.04.2013, 06:54 | #9 |
Форумчанин
Регистрация: 16.01.2011
Сообщений: 325
|
lowercase, да все уже давно поняли, что проблемы у Вас из-за того, что передаёте ноль последним параметром MapViewOfFile.
|
17.04.2013, 09:18 | #10 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
кстати, второй процесс тоже может делать CreateFileMapping().
Это удобно, когда порядок запуска процессов не определен. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
В чём разница между unit, header file, cpp file? | TwiX | Общие вопросы C/C++ | 6 | 29.04.2012 19:49 |
file mapping как с ним работать? | CodeNOT | Win Api | 2 | 01.03.2012 10:12 |
Как работать с file mapping? | castanic | Win Api | 7 | 12.11.2011 12:39 |
File Mapping | Gambler | Win Api | 1 | 13.08.2010 11:40 |
Свой PORT MAPPING (NAT) | exploys | Работа с сетью в Delphi | 0 | 05.06.2010 01:24 |