Есть один из способов загрузки файлов изображений из ресурсов при помощи библиотеки
GDI+Загружаешь файл в ресурсы.
В файле "rsrc.rc" делаешь запись:
Инициализация:
.data
gifType db "GIF", 0
.data?
gifImage dd ?
hbuffer dd ?
pIStream dd ?
rcRes dd ?
hResData dd ?
sizeOfRes dd ?
hBitmap dd ?
hHeap dd ?
hIcon dd ?
Static dd ?
hIStream dd ?
Код:
invoke FindResource, hInstance, 2001, addr gifType
mov rcRes, eax
invoke LoadResource, hInstance, rcRes
mov hResData, eax
invoke SizeofResource, hInstance, rcRes
mov sizeOfRes, eax
invoke GetProcessHeap
mov hHeap,eax
invoke HeapAlloc,hHeap,0,sizeOfRes
mov hbuffer, eax
invoke RtlMoveMemory, hbuffer, hResData, sizeOfRes
invoke CreateStreamOnHGlobal, hbuffer, FALSE, addr pIStream
invoke GdipCreateBitmapFromStream, pIStream,addr hBitmap
В итоге в переменную
hBitmap загружается хендл.
Этот метод загрузки битмапа из потока работает нормально
со всеми популярными файлами (Jpg Gif Png Bmp).
Только если захотите обьединить эти функции в одну функцию
то переменные лучше сделать глобальные а то с локальными
иногда будет работать не корректно.
Вроде бы всё хорошо всё работает но несколько смущает слишком
большой набор функций для такой операции.
Интересно что в
GDI+ есть ещё одна функция
GdipCreateBitmapFromResourceописание функции:
1 - Дескриптор экземпляра модуля.
2 - Указатель на завершающуюся нулем Unicode строку, которая определяет
путь и имя ресурса растрового изображения должны быть загружены.
Кроме того, этот параметр может состоять из идентификатора ресурса
в младшем слове и ноль в старшем слове.
3 - Указатель на DWORD переменную, которая указатель на Bitmap объекта.
По идее вроде бы должно работать так:
invoke MultiByteToWideChar,0,0,addr gifType,-1,addr Unicod,addr Char
invoke GdipCreateBitmapFromResource,hInstance,addr Unicod,addr hBitmap
Но к сожелению не работает.
И вместо "addr gifType" ставил просто "2001" всё равно
функция не срабатывает и в переменной
hBitmap чистый ноль.
Честно говоря не пойму почему.
Подозреваю только что всё таки со вторым параметром у меня ошибка.
В поиске нашёл один сайт где показаны как работают
некоторые функции
GDI+И в частности эта функция
GdipCreateBitmapFromResourcehttp://www.jose.it-berater.org/smfforum/index.php?topic=1800.0Там чисто показано что эта функция (всего одна) из ресурсов загружает битмам без проблем.
Я подумал что именно эта функция не хочет работать с таким форматом как
Gifи попробывал загрузить в ресурсы формат
Bmp но результат тот же в
hBitmap чистый ноль.
Честно говоря не понятно. Ведь если почитать описание этих функций
invoke GdipCreateBitmapFromStream, pIStream,addr hBitmapи
invoke GdipCreateBitmapFromResource,hInstance,addr Unicod,addr hBitmapУ всех в переменную
hBitmap загружается битмап картинки, только одна берёт данные из потока
а другая (могу конечно ошибатся) работает вроде бы напрямую с ресурсами.
Может кто знает в чём проблемма?