Немного об использовании ресурсов (часть третья)

В этой статье будет расмотрен еще один момент , связанный с работой ресурсов. А именно использование файлов картинок, звуков и пр. в ресурсах исполняемого файла. Данная техника широко любима людьми, которые не любят когда в папке с программой куча мелких файлов. Все это можно изящно спрятать от пользователя.

Микрософт создала довольно простые методы для данной задачи. Есть общий метод для разных форматов, но для форматов WAV , BMP , ICO созданы специальные функции для загрузки и воспроизведения.

Так чтобы поместить файлы в ресурсы надо записать в файле ресурсов:

Для BMP:

1000 RT_BITMAP "1.bmp"

Для ICO:

100 ICON "1.ico"

Для WAV:

200 WAVE "1.wav"

Как вы понимаете, первым идет идентификатор (может быть любым) для последующего обращения к ресурсу в программе. Вторым идет тип ресурса. И третьим полный путь до ресурса.

Загрузить изображение из ресурсов для использования его другими функиями GDI можно с помощью функции LoadImage. Ее параметры рассматривались в этой статье. Поэтому сразу опишу примерную загрузку:

Dim As HBITMAP bmp
bmp=LoadImage(GetModuleHandle(0),1000,IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR)


Здесь в первом параметре функции передается хендл модуля, в котором размещен ресурс картинки, а во втором идентификатор ресурса.

Для загрузки иконки можно использовать тоже прошлую функцию , но вместо типа IMAGE_BITMAP указать тип IMAGE_ICON:

Dim As HICON ico
ico=LoadImage(GetModuleHandle(0),100,IMAGE_ICON,0,0,LR_DEFAULTCOLOR)

Так же для загрузки иконки можно использовать более удобную функцию LoadIcon:

Dim As HICON ico
ico=LoadIcon(GetModuleHandle(0),100)


Как рисовать изображения имея хендл, можно найти пример в этой статье. С иконками аналогично.

Для того, чтобы проиграть звук из ресурсов, можно применить функцию PlaySound:

PlaySound(200,GetModuleHandle(0),SND_RESOURCE)


Для других типов файлов можно применить свой тип ресурса примерно так:

text mytextfile test.txt


Здесь тип ресурса mytextfile , а его имя text. Загрузить же это дело придется по средствам нескольких WinApi функций. Для начала объявим нужные нам переменные:

#INCLUDE "windows.bi"

Dim As HRSRC ResH
Dim As HGLOBAL MemH
Dim As Integer ResSize
Dim As Ubyte Ptr ResPtr

Прежде всего надо найти ресурс с помощью функции FindResource:

ResH = FindResource(0, "text", "mytextfile")


Здесь первый параметр хендл модуля, в котором расположен ресурс. Второй его имя. И третий его тип. Функция возвратит хендл блока информации о ресурсе. Его мы будем использовать двумя другими функциями SizeOfResource и LoadResource.

Функция  SizeOfResource вернет нам размер в байтах данного ресурса:

ResSize = SizeOfResource(0, ResH)

В первом параметре передается хендл модуля, в котором расположен ресурс. Во втором хендл блока информации.

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

MemH = LoadResource(0, ResH)

Для того, чтобы получить доступ к этому блоку, его надо закрепить за своим указателем. Данную возможность дает функция LockResource . У нее один параметр хендл глобального блока памяти.

ResPtr = Cptr(Ubyte Ptr, LockResource(MemH))


После того, как ресурс закреплен, хендл глобального блока памяти можно освободить с помощью функции FreeResource

FreeResource(MemH)


И далее используя указатель, можно прочитать данные хотя бы так:

For a As Integer= 0 To ResSize-1
    Print Chr(ResPtr[a]);
Next 

В окончании статьи хочется добавить, что многие библиотеки (как для музыки, так и графики) имеют методы работы с ресурсами. Не стесняйтесь использовать данную технику.