Изменение загруженного ресурса Windows

Можно ли изменять загруженный в память ресурс?

Просто у меня достаточно большие данные, плюс это некоторая структура с указателями. Я сохраняю в файле не указатели, а смещения от его начала. Если я затем загружаю в память файл и выполняю соответствующий релокейтинг - все работает.

Но если я загружаю в память ресурс и получаю указатель через LockResource - то релокейтинг тут же вызывает аварийный останов с нарушением прав доступа (Код исключения 0xc0000005).

Как я понимаю, загруженный в память ресурс изменять нельзя. Копировать достаточно большой кусок прамяти (порядка 3 мегабайт) без возможности потом выгрузить из памяти оригинал я не хочу.

Как-то можно уговорить Windows разрешить мне изменить данные в загруженном в память ресурсе?


Ответы (1 шт):

Автор решения: Герман Борисов

Как подсказывают на англоязычном SO https://stackoverflow.com/questions/43239424/write-access-violation-when-trying-to-modify-array , ресурс вместе с самим exe загружается в read-only память.

Единственный способ изменить что-то — это предварительно скопировать в другой участок памяти.

Выгрузить ресурс из памяти тоже нельзя, FreeResource на современных версиях Windows ничего не делает, а UnlockResource уже даже не описана в справке, настолько она бесполезна.

Скорее всего вам придётся изменить архитектуру, и подгружать данные не через механизм ресурсов, а из обычного файла. Или придётся пожертвовать 3+ мегабайтами дополнительной памяти.

→ Ссылка