Имеются два HBITMAP (именно HBITMAP). Нужно сравнить их bitmap'ы. Как это сделать наиболее эффективно? Вообще, мне нужно сравнить bitmap из ресурсов PE-файла, с моим .BMP
Лучше через FindResource, типа такого : Код (Text): ;===================================================================== ID_BMP = 100 ; Идентификатор ресурса module db 'resource.dll',0 ; Имя модуля mybmp file 'image.bmp' ; Ваш битмап в памяти size = $-mybmp ; Размер битмапа ;===================================================================== entry $ stdcall [GetModuleHandle],module mov esi,eax stdcall [FindResource],eax,ID_BMP,RT_BITMAP or eax,eax jz exit cmp dword[eax+4],size-sizeof.BITMAPFILEHEADER jnz exit add esi,[eax] mov edi,mybmp+sizeof.BITMAPFILEHEADER mov ecx,((size-sizeof.BITMAPFILEHEADER) and -3)/4 cld repe cmpsd jnz exit push (size-sizeof.BITMAPFILEHEADER) and 3 pop ecx repe cmpsb jz совпали exit: ;=====================================================================
Спасибо. Сам бы никогда не додумался. А где Вы это нашли? В msdn я ничего подобного не видел. Я так понял, что HRSRC, возвращаемое FindResource, нужно преобразовать в PIMAGE_RESOURCE_DATA_ENTRY.
В отладчике посмотри на ресурсы, битмап лежит в таком виде Код (Text): rva bitmap dd 1000 sizeof.bitmap dd 1024 dd 0 dd 0 data_bitmap rb sizeof.bitmap FindResource возвращает указатель на начало этой структуры, сразу сравниваем размер sizeof.bitmap с твоим, если не совпадает - дальше можно не сверять, иначе получаем указатель на data_bitmap (imagebase (GetModuleHandle) + rva bitmap) и сверяем без учета BITMAPFILEHEADER (в ресурсах RT_BITMAP его нет)