为什么这个结构应该有48个字节

时间:2010-06-18 15:48:29

标签: delphi winapi alignment

我试图将winuser.h标题的一些新部分翻译成Delphi。 为什么这个结构应该是48个字节(只有这个大小被相应的函数接受)。使用4字节边界,它看起来应该有40个字节。

  typedef struct tagGESTUREINFO {
      UINT cbSize;                    
      DWORD dwFlags;                  
      DWORD dwID;                     
      HWND hwndTarget;                
      POINTS ptsLocation;             
      DWORD dwInstanceID;             
      DWORD dwSequenceID;             
      ULONGLONG ullArguments;         
      UINT cbExtraArgs;               
  } GESTUREINFO, *PGESTUREINFO;

如果它与8字节边界有关?如果是,那么它与ULONGLONG出现结构的任何情况有关吗?

由于

3 个答案:

答案 0 :(得分:11)

结构大48字节,因为Windows API需要8字节对齐。这只是Microsoft Windows采用的惯例; MSDN says因为当前支持的最大整数类型是8字节大,所以8字节对齐确保所有整数类型都正确对齐。

(请记住,诸如winuser.h之类的头文件指定了API,但要使用该API实际使用已编译的库,您需要ABI,其中包含调用等详细信息约定和结构对齐。)

答案 1 :(得分:4)

是的,它是8的默认包装,它将ullArgument成员向上移动以使其正确对齐。有4个填充字节可以从偏移量28到32获得它。最后有4个填充字节,以确保结构数组仍然可以正确对齐该成员。

答案 2 :(得分:3)

请注意,此类型已在Delphi 2010 Windows.pas中定义。