Это 64-битный собственный код Microsoft C ++ для Windows:
hIcon = LoadBitmap( hInstance, "InternalIconBase" );
BITMAP bmp;
int goret = GetObject(hIcon, sizeof(BITMAP), &bmp);
Сбой, goret == 0.Если для третьего аргумента я передам ноль, то GetObject сообщит вам, сколько нужно байтов.Возвращает 32. Но sizeof (BITMAP) равен 28, согласно отладчику и определению в wingdi.h:
typedef struct tagBITMAP
{
LONG bmType;
LONG bmWidth;
LONG bmHeight;
LONG bmWidthBytes;
WORD bmPlanes;
WORD bmBitsPixel;
LPVOID bmBits;
} BITMAP, *PBITMAP, *NPBITMAP, *LPBITMAP;
Его размер, безусловно, составляет 28 байтов (4 * 4 байта, 2 * 2 байта,8 байт)!Мы явно загружаем BITMAP, и документация на этой странице http://msdn.microsoft.com/en-us/library/dd144904.aspx говорит, что для такого дескриптора он вернет либо размер BITMAP (который равен 28), либо DIBSECTION (который равен 92).И ни один из других типов возврата на странице документации не имеет размера где-либо около 32.
И LoadBitmap и GetObject являются просто обычными методами GDI (без перегрузки или чего-либо еще).
Наш код делаетиспользовать упаковочный материал / Zp1 на границе байта, что может объяснить, почему он работает с 32-битным кодом, но не с 64-битным кодом.Хотя обычно заголовочные файлы Microsoft переносят настройку упаковки и восстанавливают ее снова?Может быть, чего-то не хватает в заголовочных файлах GDI?