Winapi 一节有多大?

Winapi 一节有多大?,winapi,Winapi,我正在寻找与设备无关的位图结构的大小,以便在windows API中与GetObject一起使用。我有一张hBitmap。GetObject说,要获取关于hBitmap的信息,我可以发送一个具有位图结构大小或DIBSection大小的缓冲区。我不知道位图和DIBSECTION结构的确切大小,有人能告诉我它们在32位和64位系统上都是什么吗 您不需要手动进行任何数学运算。只需声明一个DIBSECTION变量,然后将指向该变量的指针连同sizeof作为该变量的大小传递给GetObject,例如: D

我正在寻找与设备无关的位图结构的大小,以便在windows API中与GetObject一起使用。我有一张hBitmap。GetObject说,要获取关于hBitmap的信息,我可以发送一个具有位图结构大小或DIBSection大小的缓冲区。我不知道位图和DIBSECTION结构的确切大小,有人能告诉我它们在32位和64位系统上都是什么吗

您不需要手动进行任何数学运算。只需声明一个DIBSECTION变量,然后将指向该变量的指针连同sizeof作为该变量的大小传递给GetObject,例如:

DIBSECTION dib;
GetObject(hBitmap, sizeof(dib), &dib);

在收到一些毫无帮助的评论后,包括sizeof,你是否使用了sizeof,你是否应该使用sizeof,我拿出一张纸,自己把所有的东西都加了起来

一节包含5个部分

typedef struct tagDIBSECTION {
  BITMAP           dsBm;
  BITMAPINFOHEADER dsBmih;
  DWORD            dsBitfields[3];
  HANDLE           dshSection;
  DWORD            dsOffset;
} DIBSECTION, *LPDIBSECTION, *PDIBSECTION;
让我们从位图开始

一个LONG就是一个4字节的int。字是2字节的无符号短字符。LPVOID是一个ptr

4+4+4+4+2+2=20。但是等等,结构必须正确对齐。所以我们需要在64位系统上测试8的可除性。20不能被8整除,所以我们添加4字节的填充来得到24。加上ptr,我们得到32

BitMapInfo标头的大小为40字节。它可以被8整除,所以不需要任何幻想。我们现在72岁了

回到第二节。有一系列的DWORD。每个DWORD是一个无符号整数,12加72等于84

现在有一个把手。句柄基本上是指针,其值可以是4或8,具体取决于32位或64位。检查84是否可被8整除的时间。事实并非如此,我们添加了4个字节的填充以获得88。然后添加指针以获取96

最后是最后一个DWORD,在64位系统上总数达到100

但是sizeof呢??????你不能只做sizeofDIBSECTION吗?毕竟,神奇的数字=糟糕。连肯·怀特都说数学不好

首先,作为一名程序员,理解发生了什么以及为什么发生是很重要的。没有什么比计算机上的内存更基本了。第二,我只将帖子标记为winapi。对于阅读本文的人,如果在GetObject页面上向下滚动,函数将在Gdi32.dll上导出。任何windows程序都可以访问Gdi32.dll。并非每个windows程序都可以访问sizeof。第三,对于需要了解数学的人来说,展示步骤可能很重要。不是每个人都用高级语言编程。这甚至可能是考试中的一道题

最后,我真的不知道如何重新措辞我的问题,以得到想要的答案。询问一个分区的大小是多少?这是非常清楚的。然而,我得到了非常迂回的回答,却从未回答过我的问题


也许真正的问题是,当在64位系统上授予内存时,大小为100的结构是否会被填充到104

使用sizeof在运行时获取其中一个的大小。我如何做到这一点?通过阅读文档,我的数学显示32位为84,64位为104。你不需要数学。您需要使用sizeof运算符。@EdisonHua当然,有人可以告诉您所要求的具体答案,但这对您的长期帮助不大。许多API将结构大小作为输入。如果你想解释为什么不能使用sizeof ie,因为你使用的是一种不可用的语言,哪一种?那么也许有人可以向你解释如何自己解决这个问题,这样下次遇到同样的问题时,你就不必再问另一个API了。谢谢你的帮助。我只需要一个分区的大小,很抱歉有任何混淆,我不知道有什么更好的方法可以问。只是这个大小属于A.注意我没有指定任何语言,只是winapi?冒昧地假设我有sizeof操作符以及头文件。@EdisonHua Win32 API是基于C的API,因此它对开发人员的环境做出了某些假设。大多数语言都有查询类型大小的方法。但是如果你真的需要更好的帮助,那么你应该提到你正在使用的实际语言Win32 API是在一系列DLL中导出的。事实上,在windows上运行的任何程序都可以访问GDI32.dll。对任何程序。@EdisonHua任何与C兼容的语言,也就是说。由于语言限制,有些语言无法访问Win32 DLL和/或API的各种功能。下面是一个不友好编辑的示例。“我是来寻求帮助的,不是来编辑我的问题的。”。我相信正确的答案是,在32位和64位系统上,DIBSection的大小分别是84字节和100字节。如果你觉得你有一个更好的答案可以更清晰、更精确地解释这一点,那么提问者可能会喜欢阅读并将其标记为正确答案。幸运的是,相关问题侧边栏比人类更了解问题,并将我引导到这一页:它解释了字符、短字符和int的自我对齐
s、 PTR非常完美,现在我也明白了数学的来源了!位图上的数学逻辑有点误导,但最终结果是正确的。结构对齐不仅仅是确保结构的总体大小是均匀可分的。您还必须确保每个数据成员的起始偏移量可以被其自身的对齐方式整除。这可能会在数据成员之间引入填充,而不仅仅是在结构的末尾。这就是为什么必须在LPVOID之前添加字节。当结构包含其他结构时尤其如此。位图结构的第一个值是40。它总是40,因为这是结构的预定大小。假设40可被指针8和4的大小整除,则不需要计算偏移量。使用的不是指针的对齐方式。Win32 API在32位和64位上都使用qword 8字节对齐。恰好64位指针也是8字节。
typedef struct tagBITMAP {
  LONG   bmType;
  LONG   bmWidth;
  LONG   bmHeight;
  LONG   bmWidthBytes;
  WORD   bmPlanes;
  WORD   bmBitsPixel;
  LPVOID bmBits;
} BITMAP, *PBITMAP, *NPBITMAP, *LPBITMAP;