Окт 16

Доступ к данным в ресурсе

Для получения доступа к данным ресурса, определенного программистом, используются функции FindResource, LoadResource и LockResource.
Функция FindResource ищет ресурс указанного типа в соответствующем модуле. Она имеет следующий прототип:
HRSRC FindResourcetHMODULE hModule. LPCTSTR IpName, LPCTSTR IpType);
Параметр hModule позволяет указывать дескриптор модуля выполняемого файла, который содержит указанный ресурс. Если hModule равен NULL, то Windows ищет ресурс в модуле, создавшем текущий процесс.
Параметр IpName содержит имя ресурса, представленное, как правило, строкой. Но если первым символом в строке является знак «#», то остальная часть представляет целое значение идентификатора ресурса. Параметр IpType задает тип ресурса.
При успешном выполнении функция возвращает дескриптор информационного блока указанного ресурса, а не дескриптор самого ресурса. Чтобы получить дескриптор ресурса, нужно передать дескриптор информационного блока функции LoadResource. В случае неудачи функция FindResource возвращает значение NULL.
Функция LoadResource загружает ресурс, найденный функцией FindResource, в глобальную область памяти. Прототип этой функции выглядит следующим образом:
HGLOBAL LoadResource(HMODULE hModule. HRSRC hResInfo):
Параметру hResInfo должен передаваться дескриптор информационного блока, возвращенный функцией FindResource.
Хотя адрес, возвращаемый функцией LoadResource, в принципе, можно использовать для доступа к данным ресурса, MSDN рекомендует получать указатель на эти данные, вызывая функцию LockResource:
LPVOIQ LockResource(HGLOBAL hResData);
Функция осуществляет блокировку указанного ресурса в памяти. Параметр hResData — это дескриптор ресурса, который должен быть заблокирован. В качестве параметра необходимо передать адрес, возвращенный функцией LoadResource.
В случае успешного выполнения функция LockResource возвращает указатель на первый байт данных ресурса, в случае неудачи — значение NULL.
После использования данных ресурса его разблокировка не требуется, так как система автоматически удаляет ресурс из памяти при закрытии приложения.
Если вернуться к примеру с файлом proghelp.txt, который был добавлен к приложению в виде определенного программистом ресурса, то доступ к данным этого ресурса можно получить при помощи следующего фрагмента кода:
HGLOBAL hResource = LoadResource(hInsLance.
MndResourceChlnstance, "HELP!EXT". "TEXT")); char pHelpfext -- (char) LockResource(hResource);