Освобождение загруженного ресурса

156
19 июня 2022, 20:20

Есть консольная программа с бинарными ресурсами (Windows). Нашел, как загружать, записывать в файл и так далее -

HMODULE hMod=GetModuleHandle(NULL);
if(!hMod) { /* Error */ }
HRSRC hRes=FindResource(hMod,"Data",RT_RCDATA);
if(!hRes) { /* Error */ }
HGLOBAL hGlob=LoadResource(hMod,hRes);
if(!hGlob) { /* Error */ }
char * array=(char *)LockResource(hGlob);
if(!array) { /* Error */ }
unsigned int dwFileSize=SizeofResource(hMod,hRes);
if(!dwFileSize) { /* Error */ }

Все работает. Но если я верно понимаю прочитанное, то этот ресурс остается в памяти до конца работы программы.

The pointer returned by LockResource is valid until the module containing the resource is unloaded. It is not necessary to unlock resources because the system automatically deletes them when the process that created them terminates.

А у меня их много, я потому и ресурсами их делал, чтоб в памяти не держать. А как его из памяти выгрузить, когда он больше не нужен? Ждать, когда программа завершится - не дело.

Answer 1

Windows автоматически управляет ресурсами, а выгружаются они при выгрузке модуля к которому относятся, это можно сделать функцией FreeLibrary. Некоторые типы ресурсов требуют дополнительного явного внимания, подробности описаны здесь: Finding and Loading Resources. LockResource же нужно использовать для того чтобы ресурс не был выгружен до конца работы с модулем, т.е. отключить автоматическую выгрузку.

READ ALSO
Обозначение указателей в C++

Обозначение указателей в C++

ЗдравствуйтеЕсть ли какие-нибудь существенные различия между такими определениями указателя:

218
Boost Asio Streambuf, UDP, Передача структур данных по сети

Boost Asio Streambuf, UDP, Передача структур данных по сети

Всем привет! Когда клиент отправляет серверу(или наоборот) буфер данных сделанное с помощью boost::asio::streambuf то данные как то смещаются и на выходе...

263
Почему внедрение библиотеки не работает?

Почему внедрение библиотеки не работает?

Пытался написать код на внедрение библиотеки в только что созданный процесс, но что-то не получаетсяФункция inject возвращает true, но сама библиотека...

160