Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > На что указывает HBITMAP?


Автор: Тутанхамец 22.2.2006, 10:33
Нашёл кучу информации о том, как выглядит bmp в файле на диске. Но нигде не сказано, каков он в памяти после, например, LoadImage?

Сначала подумал, что HBITMAP должен указывать на BITMAP. Проверил с помощью CopyMemory. Непохоже. Непохоже и на BITMAPINFOHEADER. И уж тем более непохоже на BITMAPFILEHEADER.

Уважаемые, заранее благодарен smile

Автор: Romikgy 22.2.2006, 10:47
Код

HBITMAP CreateCompatibleBitmap(

    HDC hdc,    // handle to device context 
    int nWidth,    // width of bitmap, in pixels  
    int nHeight    // height of bitmap, in pixels  
   );    
 

Parameters

hdc

Identifies a device context. 

nWidth

Specifies the bitmap width, in pixels. 

nHeight

Specifies the bitmap height, in pixels. 

 

Return Values

If the function succeeds, the return value is a handle to the bitmap.
If the function fails, the return value is NULL. 

handle to the bitmap.
Это не указатель а хендл, т.е. подобное хендлу любого окна виндов smile

Автор: Тутанхамец 22.2.2006, 11:01
Ты уж прости, но либо я не понял ответа, либо ты не понял вопроса. smile

Всегда считал, что хэндл (который определен как void *) это и есть указатель.

Меня интересует, что я найду в тех байтах памяти, на которые указывает HBITMAP. Что там будет? Структура какая-то, которая описывает картинку? Вряд ли ведь сразу массив байтов картинки?

Автор: Romikgy 22.2.2006, 11:16
Код

#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n 
DECLARE_HANDLE(HBITMAP);

Я не совсем понял дефайн, но как я понял что хендл идет указатель на структуру, а структуре целое число!
число указывает номер в хендлах зарегестрерованых в системе, имхо
Цитата(Тутанхамец @ 22.2.2006, 10:01 Найти цитируемый пост)
что я найду в тех байтах памяти

Имхо смысла ковырятся в хендлах нету
Цитата(Тутанхамец @ 22.2.2006, 10:01 Найти цитируемый пост)
Структура какая-то,

описана выше

Автор: Тутанхамец 22.2.2006, 11:39
Да мне не сам хендл был нужен, а картинка, которая за ним в памяти лежит, но не через HBITMAP, а побайтово. В API для этого есть GetDIBits, SetDIBits и CreateDIBSection, но там уж больно много структур, сжатия и всего прочего. Есть еще вариант работать с картинкой, скидывая ее во временный файл на диск, а это хоть медленнее, но проще.

Ладно, закрыли тему. smile

Автор: Romikgy 22.2.2006, 12:24
Цитата(Тутанхамец @ 22.2.2006, 10:39 Найти цитируемый пост)
Да мне не сам хендл был нужен, а картинка, которая за ним в памяти лежит, но не через HBITMAP, а побайтово.

Цитата(Тутанхамец @ 22.2.2006, 10:39 Найти цитируемый пост)
GetDIBits

Чем не нравится?

Цитата(Тутанхамец @ 22.2.2006, 10:39 Найти цитируемый пост)
Ладно, закрыли тему.

Ну так и закрывай smile




Автор: Fixin 22.2.2006, 15:32
Есть ф-ция GetBitmapBits - то что тебе нужно.

Автор: Тутанхамец 23.2.2006, 21:01
Спасибо, Fixin smile Хотя до GetBitmapsBits и SetBitmapBits я уже своим умом допёр. smile

Автор: adonin 24.2.2006, 12:56
Цитата(Тутанхамец @ 22.2.2006, 11:01 Найти цитируемый пост)
Всегда считал, что хэндл (который определен как void *) это и есть указатель.


Хотя тема и закрыта, считаю необходимым развеять приведённое выше заблуждение.
HANDLE объекта это не указатель на объект, а его идентификатор. Так HANDLE файла - это id объекта FILE_OBJECT, с которым оперирует ядро. Коду 3-го кольца привилегий прямой доступ туда не желателен. Поэтому приложению возвращают не указатель (POINTER), а описатель (HANDLE). Имея описатель объекта, ядро находит объект в списке объектов и производит над ним требуемые действия.
HANDLE HBITMAP не есть указатель на объект.

Автор: Тутанхамец 25.2.2006, 09:39
Тему никогда не поздно открыть опять. smile Я просто руководствовался следующим:

Цитата

Справедливости ради, надо отметить, что в Win32 присваиваются хэндлы чему угодно - окну, меню, курсору, иконке и т.д. Фактичеаки хэндл - это указатель на блок памяти, в котормо размещен тот ии иной объект. В заголвочных файлах тип HANDLE определен как void *...
...Уважаемый читатель! Обратите внимание на вытекающее из этого положения следствия. Раз уж объект имеет хэндл, который является УКАЗАТЕЛЕМ, то, значит, этот объект сам расположен в памяти! Другими словами, в тех случаях, когда мы должны получить хэндл того или иного объекта фактически мы должны получить адрес загруженного в память объекта!

П.В. Румянцев, "Азбука программирования в Win32 API


Видимо, я превратно понял мысль П.В. smile

Получается, не используя специальные функции типа GetDIBits, я не могу найти, где в памяти хранятся байты битмапа и связанные с ними структуры? "Найти"="узнать начальный адрес и размер".

Автор: Fixin 25.2.2006, 13:52
Цитата(Тутанхамец @ 25.2.2006, 09:39 Найти цитируемый пост)
не используя специальные функции
Ну да. в этом суть безопасности ядра системы, чтобы ты не записал куда-нибудь что-нибудь, а в результате вся система накрылась.
Добавлено @ 13:53
Цитата(Тутанхамец @ 25.2.2006, 09:39 Найти цитируемый пост)
специальные функции типа GetDIBits
Они вынимают из дескриптора адрес (в данном случае)

Автор: Тутанхамец 25.2.2006, 16:52
Ладно, с хбитмапом более-менее ясно. Тем более, что я всё равно решил работать с картинкой не в памяти, а сбрасывать ее во временный промежуточный файл, а оттуда уже читать.

Fixin, скажи, а кто такой шушпанчик? smile

Автор: Fixin 25.2.2006, 20:18
Цитата(Тутанхамец @ 25.2.2006, 16:52 Найти цитируемый пост)
кто такой шушпанчик?
Поиск по форуму.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)