Почему эта структура должна иметь 48 байтов - PullRequest
1 голос
/ 18 июня 2010

Я попытался перевести какую-то новую часть заголовка 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-байтовой границей?если да, то относится ли это к какому-либо случаю, когда УЛОНГЛОНГ представляет структуры?

Спасибо

Ответы [ 3 ]

11 голосов
/ 18 июня 2010

Структура имеет размер 48 байтов, поскольку для Windows API требуется 8-байтовое выравнивание.Это просто соглашение, принятое Microsoft Windows; MSDN говорит: это потому, что самый большой поддерживаемый тип в настоящее время поддерживается размером 8 байт, поэтому 8-байтовое выравнивание обеспечивает правильное выравнивание всех целых типов.

(Имейте в виду, что файлы заголовков, такие какwinuser.h задает API , но для фактического использования уже скомпилированной библиотеки с использованием этого API вам необходим ABI , который включает в себя такие детали, как соглашения о вызовах и выравнивание структуры.)

4 голосов
/ 18 июня 2010

Да, это упаковка по умолчанию 8, которая перемещает элемент ullArgument вверх, чтобы выровнять его должным образом. Там есть 4 байта заполнения, чтобы получить его от смещения 28 до 32. И 4 байта заполнения в конце, чтобы гарантировать, что массив структур все еще имеет этот элемент выровненным правильно.

3 голосов
/ 18 июня 2010

Обратите внимание, что этот тип уже определен в Delphi 2010 Windows.pas.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...