【问题标题】:Why this structure should have 48 bytes为什么这个结构应该有 48 个字节
【发布时间】:2010-06-19 02:03:29
【问题描述】:

我尝试将 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 出现结构的任何情况有关吗?

谢谢

【问题讨论】:

    标签: delphi winapi alignment


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 是的,我知道,但我设法为更早的版本做到这一点
        猜你喜欢
        • 2021-05-19
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        • 2021-11-08
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        相关资源
        最近更新 更多