Когда загружаются ресурсы PE-файла


При использовании ресурса, включенного в PE-файл (например, двоичного ресурса) в C++ . мы должны это сделать. первый вызов

1) FindResource, а затем

2) LoadResource
чтобы получить доступ к ресурсу .

Будучи точным относительно имени функции "LoadResource", я задаюсь вопросом, загружает ли" загрузчик Windows " весь ресурс приложения в память только при загрузке других частей (например, кода или раздела данных) или они загружаются с задержкой только тогда, когда они нам нужны ?

Если так можно мы выгружаем эти ресурсы после того, как мы их использовали, чтобы освободить выделенную память?

1 2

1 ответ:

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

Те дни давно прошли, загрузчик ОС создает файл, сопоставленный с памятью, чтобы сопоставить исполняемый файл в память. И все, что находится в файле (код и ресурсы), отображается в ОЗУ только тогда, когда программа разыменовывает указатель. Вы платите только за то, что используете.

Поэтому LoadResource () делает очень мало того, он просто возвращает указатель, замаскированный под глобальный дескриптор. LockResource () не делает ничего интересного, он просто возвращает HGLOBAL к указателю. Когда вы действительно начнете использовать его, вы столкнетесь с ошибкой страницы, и ядро считывает файл, загружая его в оперативную память. UnlockResource() и FreeResource () ничего не делают. Если ОС нужна оперативная память для другого процесса, то она может размонтировать оперативную память для ресурса. Ничего не нужно сохранять, так как память поддерживается файлом, страница может просто быть отброшенным. При необходимости, если вы снова используете ресурс, он будет возвращен на страницу.