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