Загрузка произвольных данных из ресурсов приложения
Получение идентификатора произвольных данных из ресурсов приложения - трехступенчатый процесс. Вначале с помощью функции FindResource необходимо определить расположение ресурса в файле приложения:
HRSRC WINAPI FindResource(HINSTANCE hInst, LPCSTR lpszName, LPCSTR lpszType);
Параметр hInst является идентификатором модуля, содержащего ресурс. Для извлечения ресурса из приложения вы должны указать его идентификатор, передаваемый функции WinMain через параметр hInstance.
Параметр lpszName должен содержать адрес имени ресурса. Для загрузки произвольных данных в качестве этого параметра следует передать указатель на строку, содержащую идентификатор ресурса. В приведенном выше примере используется идентификатор "Hello".
Параметр lpszType - адрес строки, содержащий тип ресурса. Для нашего примера это должна быть строка "SOUND".
Таким образом, поиск ресурса, описанного как
Hello SOUND hello.wav
должен выполняться следующим образом:
HRSRC hRsrc; hRsrc = FindResource(hInstance, "Hello", "SOUND");
Функции FindResource в качестве третьего параметра можно передавать идентификаторы предопределенных типов ресурсов, список которых приведен ниже (некоторые из перечисленных типов ресурсов вам пока незнакомы, мы расскажем о них позже).
Идентификатор ресурса | Название ресурса |
RT_ACCELERATOR | Таблица акселераторов |
RT_BITMAP | Изображение bitmap |
RT_CURSOR | Курсор |
RT_DIALOG | Диалоговая панель |
RT_FONT | Шрифт |
RT_FONTDIR | Каталог шрифтов |
RT_ICON | Пиктограмма |
RT_MENU | Меню |
RT_RCDATA | Произвольные данные |
RT_STRING | Таблица строк |
Вы можете использовать функцию FindResource для загрузки таких ресурсов, как пиктограммы или курсоры, указав ей тип ресурса, соответственно, RT_ICON или RT_CURSOR. Однако в документации к SDK сказано, что загрузку предопределенных ресурсов, таких как пиктограммы и курсоры, следует выполнять специально предназначенными для этого функциями (LoadIcon, LoadCursor и т. д.).
На втором этапе, после того как ресурс найден, его следует загрузить, вызвав функцию LoadResource:
HGLOBAL WINAPI LoadResource(HINSTANCE hinst, HRSRC hrsrc);
Параметр hinst представляет собой идентификатор модуля, из файла которого загружается ресурс. Если ресурс загружается из файла вашего приложения, используйте значение hInstance, полученное через соответствующий параметр функции WinMain.
В качестве второго параметра этой функции следует передать значение, полученное от функции FindResource.
Третий этап заключается в фиксировании ресурса в оперативной памяти функцией LockResource:
void FAR* WINAPI LockResource(HGLOBAL hGlb);
В качестве параметра hGlb функции LockResource следует передать идентификатор ресурса, полученный от функции LoadResource.
Функция LockResource фиксирует данные в памяти и возвращает дальний указатель на соответствующий буфер. После фиксирования Windows не станет удалять сегмент с ресурсами из памяти, так что приложение сможет использовать данные в любой момент времени.
После того как приложение использовало ресурс и он стал ненужен, следует расфиксировать память ресурса, вызвав функцию UnlockResource. Функция определена через функцию GlobalUnlock следующим образом:
BOOL WINAPI GlobalUnlock(HGLOBAL hGlb); #define UnlockResource(h) GlobalUnlock(h)
Эти, а так же другие функции управления памятью мы рассмотрим позже, в отдельной главе, посвященной управлению памятью в операционной системе Windows.
Перед завершением работы приложения следует освободить полученный ресурс, вызвав функцию FreeResource:
BOOL WINAPI FreeResource(HGLOBAL hGlb);
В качестве параметра hGlb следует передать идентификатор ресурса, полученный от функции LoadResource.