GetObject возвращает странный размер - PullRequest
1 голос
/ 15 марта 2011

Это 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?

1 Ответ

1 голос
/ 15 марта 2011

Действительно, потому что, кажется, работает нормально, если я сделаю это:

//wingdi.h does not set the proper pack setting, causing structures to have the wrong size due to our /Zp1!
//32-bit: sizeof(BITMAP)==24
//32-bit: sizeof(BITMAP)==28 but GetObject says it wants 32, so:
    #ifdef _WIN64
       #pragma pack(push,8)
    #endif
#   include <windows.h>
    #ifdef _WIN64
       #pragma pack(pop)
    #endif
...