С какой стороны подойти к хранению тяжеловесных ресурсов в исполняемом файле?
Возникла необходимость хранить ресурсы большого объёма в единых исполняемых файлах. В частности, используется MSVC в связке с Qt. Стандартные схемы ресурсов Qt и Win API не подходят, поскольку категорически нежелательно загружать ресурсы в память — в идеале их нужно по частям читать из исполняемого файла.
В качестве примера можно привести самораспаковывающиеся архивы, которые создают 7-zip и WinRar. Хотелось бы достичь такого же эффекта на этапе сборки, не прибегая к пост-обработке исполняемых файлов и парсингу их структуры при исполнении.
Хорошо, а вы пробовали по принципу RARJPEG — склеить ресурсы с исполняемым файлом.
А потом уже в процессе загрузки по меткам в файле находить реурсы и работать с ними
Самое главное в этом методе — не выситывать ресурсы «в лоб», а использовать memory mapped files. Тогда в памяти будут только те ресурсы, которые в данный момент актуальны, и оптимальность доступа будет обеспечивать кеш дисковой подсистемы Windows
Я же в вопросе написал, что такие методы с парсингом нежелательны. Тогда уж лучше использовать структуру PE-файла, создав необходимую секцию. Вопрос только в том, как это сделать на этапе сборки.
Я крайне не люблю исполняемые файлы размером в десятки мегабайт, но раз уж Вы уже все равно решили их использовать и единственное решение, которое осталось принять — это, собственно, как, то используйте ресурсы и не морочьте голову. Винда как раз таки и использует меппинг для загрузки исполняемых файлов с деманд-пейджингом страниц в момент доступа.
Я крайне не люблю исполняемые файлы размером в десятки мегабайт
Они для удобного распространения и одноразового использования, как и SFX-архивы. На мой взгляд, монолитный исполняемый файл здесь — наилучший выход.
но раз уж Вы уже все равно решили их использовать и единственное решение, которое осталось принять — это, собственно, как, то используйте ресурсы и не морочьте голову. Винда как раз таки и использует меппинг для загрузки исполняемых файлов с деманд-пейджингом страниц в момент доступа.
Спасибо. Видимо, это действительно решение. Я предполагал, что при доступе ресурсов используются подобные механизмы, но не был в этом уверен, особенно из-за функции «LoadResource».
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.