2010-06-18 12 views
1

J'ai essayé de traduire une nouvelle partie de l'en-tête winuser.h en Delphi. Pourquoi cette structure devrait être de 48 octets (seule cette taille a été acceptée par la fonction correspondante). Avec une limite de 4 octets, il semble qu'il devrait avoir 40 octets.Pourquoi cette structure devrait avoir 48 octets

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

S'il s'agit d'une limite de 8 octets? Dans l'affirmative, est-ce pertinent dans tous les cas où ULONGLONG apparaît des structures?

Merci

Répondre

11

La structure est de 48 octets grand car l'API Windows nécessite un alignement de 8 octets. C'est simplement la convention adoptée par Microsoft Windows; MSDN says C'est parce que le type intégral le plus important actuellement supporté est de 8 octets, donc l'alignement de 8 octets garantit que tous les types entiers sont correctement alignés.

(Gardez à l'esprit que les fichiers d'en-tête tels que winuser.h spécifier un API, mais d'utiliser effectivement une bibliothèque déjà compilé en utilisant cette API, vous avez besoin d'un ABI, qui comprend des détails comme les conventions d'appel et l'alignement de la structure.)

4

Oui, c'est l'emballage par défaut de 8 qui déplace le membre ullArgument vers le haut pour l'aligner correctement. Il y a 4 octets de remplissage là pour l'obtenir de 28 à 32. Et 4 octets de remplissage à la fin pour s'assurer qu'un tableau de structures a toujours ce membre aligné correctement.

3

Notez que ce type est déjà défini dans le Windows.pas 2010 de Delphi.

+0

Oui, je sais, mais je parviens à le faire pour une version beaucoup plus ancienne – Maksee