
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.225.221.151] |
![]() |
|
![]() |
|
|
Вопрос по файлам отображаемым в память. Возникла проблема. В главном процессе создаю файл отображаемый в память:
![]() ![]() hFile = CreateFile("page.swp", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, NULL, sizeof(CLIENT_CONTEXT), "FastJobSwap"); lpContext = (LPCLIENT_CONTEXT) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); Заполняю его нужными мне данными, и далее пытаюсь открыть этот файл в дочернем процессе: ![]() ![]() hMap = OpenFileMapping(PAGE_READWRITE, FALSE, "FastJobSwap"); lpContext = (LPCLIENT_CONTEXT) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); MapViewOfFile возвращает ошибку номер 5 (отказано в доступе). Если поменять флаг FILE_MAP_ALL_ACCESS на FILE_MAP_READ, то всё работает, все данные передаются в том виде, в каком мне надо (FILE_MAP_WRITE, как и следовало ожидать тоже не работает). Как сделать так, чтобы был доступ к отображённому файлу также и на запись, а не только на чтение? Вот на этой ссылке парень говорит, что у него всё заработало, когда он SECURITY_ATTRIBUTES добавил. Попробовал пойти его путём, но MapViewOfFile по-прежнему жалуется, что у неё нет доступа: StartService & SetHook & OpenFileMapping все вместе не работает |
Сообщ. #2,
|
|
|
![]() ![]() OpenFileMapping(FILE_MAP_ALL_ACCESS, |
Сообщ. #3,
|
|
|
Спасибо, Hryak, решение помогло, но возникла ещё одна проблема. Через структуру CLIENT_CONTEXT я передаю хэндл события (hEvent) созданного функцией CreateEvent. Логика работы моей программы подразумевает, что родительский процесс создаёт hEvent, передаёт его дочернему процессу, а тот, когда выполнит определённые действия устанавливает это событие (функцией SetEvent).
Но эта логика у меня не работает: функция SetEvent, вызванная в дочернем процессе возвращает ошибку. Тот же вызов в родительском процессе завершается успешно. Как я понял, между двумя процессами хэндлы нельзя так просто передавать, а как можно? |
Сообщ. #4,
|
|
|
Цитата Vedrus @ о родительский процесс создаёт hEvent, передаёт его дочернему процессу А как ты передаешь? Просто как число нельзя так просто. Нужно или делать хендл наследуемым и наследовать при создании дочернего процесса (тогда можно и как число передать), либо как у тебя с мапой сделано (именной объект ядра) или с помощью DuplicateHandle |
Сообщ. #5,
|
|
|
Спасибо за много вариантов. Я для себя ещё один нашёл, его и использовал - задал символьные имена событиям и через OpenEvent открыл их в дочернем процессе.
|
Сообщ. #6,
|
|
|
Цитата Vedrus @ для себя ещё один нашёл, его и использовал - задал символьные имена событиям и через OpenEvent открыл их в дочернем процессе. Это и есть Цитата Hryak @ Точнее, именное событие, а не хендл, конечно именной хендл |