GetObject返回奇怪的大小

这是64位Microsoft C ++ Windows本地代码:

 hIcon = LoadBitmap( hInstance, "InternalIconBase" );
 BITMAP bmp;
 int goret = GetObject(hIcon, sizeof(BITMAP), &bmp);

这失败了,goret == 0。 如果我为第三个参数传递null,那么GetObject会告诉你它需要多少字节。 它返回32.但根据调试器和wingdi.h中的定义,sizeof(BITMAP)是28。

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位代码上工作。 虽然通常微软的头文件会推动打包设置并重新恢复它? 也许这是从GDI头文件不知何故失踪?


确实,因为如果我这样做似乎工作得很好:

//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
链接地址: http://www.djcxy.com/p/84139.html

上一篇: GetObject returns strange size

下一篇: C# Drawing.Imaging dropping GIF frames if they are identical