Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2012, 00:33   #1
assch
Пользователь
 
Регистрация: 13.09.2010
Сообщений: 65
По умолчанию Загрузка графических файлов из ресурсов

Есть один из способов загрузки файлов изображений из ресурсов при помощи библиотеки GDI+
Загружаешь файл в ресурсы.
В файле "rsrc.rc" делаешь запись:

Код:
2001 GIF "a.gif"
Инициализация:

Код:
.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+
И в частности эта функция GdipCreateBitmapFromResource

http://www.jose.it-berater.org/smffo...p?topic=1800.0

Там чисто показано что эта функция (всего одна) из ресурсов загружает битмам без проблем.
Я подумал что именно эта функция не хочет работать с таким форматом как Gif
и попробывал загрузить в ресурсы формат Bmp но результат тот же в hBitmap чистый ноль.
Честно говоря не понятно. Ведь если почитать описание этих функций

invoke GdipCreateBitmapFromStream, pIStream,addr hBitmap
и
invoke GdipCreateBitmapFromResource,hInsta nce,addr Unicod,addr hBitmap

У всех в переменную hBitmap загружается битмап картинки, только одна берёт данные из потока
а другая (могу конечно ошибатся) работает вроде бы напрямую с ресурсами.

Может кто знает в чём проблемма?

Последний раз редактировалось assch; 19.01.2012 в 03:28.
assch вне форума Ответить с цитированием
Старый 20.01.2012, 14:44   #2
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

посмотри какой код возвращает функция GdipCreateBitmapFromResource, правильно ли MultiByteToWideChar конвертирует текст к юникод, убедись в отладчие что все параметры указываются правильно и т.д.

а вообще
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
Цитата:
Windows GDI+ exposes a flat API that consists of about 600 functions, which are implemented in Gdiplus.dll and declared in Gdiplusflat.h. The functions in the GDI+ flat API are wrapped by a collection of about 40 C++ classes. It is recommended that you do not directly call the functions in the flat API. Whenever you make calls to GDI+, you should do so by calling the methods and functions provided by the C++ wrappers. Microsoft Product Support Services will not provide support for code that calls the flat API directly. For more information on using these wrapper methods, see GDI+ Flat API.
если по-русски, то там говорится что использовать эти функции не рекомендуется
progromore.i2p - первый русскоязычный портал программистов в скрытосети

Последний раз редактировалось Rock-n-Rolla; 20.01.2012 в 14:47.
Rock-n-Rolla вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эскизы графических файлов в OpenPictureDialog Loveb Компоненты Delphi 4 22.11.2010 11:03
Загрузка иконки из ресурсов. Flippp Общие вопросы C/C++ 3 02.06.2010 15:58
Загрузка текстового файла из ресурсов SolovejK Общие вопросы Delphi 1 22.05.2010 20:18
Лента графических файлов бел Помощь студентам 1 13.04.2009 10:15
Открытия графических файлов Kocapb Общие вопросы C/C++ 3 01.12.2007 19:11