Structure ACCEL

Archive.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Structure ACCEL

Message par Anonyme2 »

Voici la structure selon MS

Code : Tout sélectionner

typedef struct tagACCEL {
    BYTE fVirt;
    WORD key;
    WORD cmd;
} ACCEL, *LPACCEL;
et celle déclarée en PB

Code : Tout sélectionner

Structure ACCEL
  fVirt.w
  key.w
  cmd.w
EndStructure
Le 1er élément est à corriger en byte au lieu de word
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

Corrigé. A noter qu'il faut ajouter un 'pad.b' apres le fvirt.b sinon l'alignement de la structure n'est pas respectée.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Fred a écrit :Corrigé. A noter qu'il faut ajouter un 'pad.b' apres le fvirt.b sinon l'alignement de la structure n'est pas respectée.
Si je comprend bien, toutes les structures PB ayant une taille impaires sont fausses (je n'ai pas testé)
Dernière modification par Anonyme2 le lun. 16/mai/2005 7:21, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ca m'a tellement travaillé que je n'ai pas dormi de la nuit (non je plaisante , :mrgreen: )

j'ai passé tous les résidents à la moulinette et voici toutes les structures dont la taille est impaire; par contre il est tout à fait possible d'avoir des structures dont la taille est paire avec par exemple 2 éléments bytes ; certains élments de la structure n'auront pas une adresse alignée (je vais regarder ça aussi)

Je pense qu'il faut expliquer cela dans l'aide

Code : Tout sélectionner

residents PB

Structure BYTE     Taille :1
Fichier résident : PureBasic_x86.res

Structure RGBTRIPLE     Taille :3
Fichier résident : Windows.res

Structure TEXTMETRIC     Taille :53
Fichier résident : Windows.res

Structure NEWTEXTMETRIC     Taille :69
Fichier résident : Windows.res

Structure RGNDATA     Taille :33
Fichier résident : Windows.res

Structure ENUMLOGFONTEX     Taille :7
Fichier résident : Windows.res

Structure MENUITEMTEMPLATE     Taille :5
Fichier résident : Windows.res

Structure DDEDATA     Taille :13
Fichier résident : Windows.res

Structure DDEPOKE     Taille :9
Fichier résident : Windows.res

Structure DDEUP     Taille :13
Fichier résident : Windows.res

Structure MONHSZSTRUCT     Taille :21
Fichier résident : Windows.res

Structure SMPTE     Taille :7
Fichier résident : Windows.res

Structure NCB     Taille :63
Fichier résident : Windows.res

Structure MODEMDEVCAPS     Taille :77
Fichier résident : Windows.res

Structure MODEMSETTINGS     Taille :45
Fichier résident : Windows.res

Structure ICMP_HDR     Taille :9
Fichier résident : Windows.res

Structure DEV_BROADCAST_PORT     Taille :13
Fichier résident : Windows.res

Structure NMCBEENDEDIT     Taille :25
Fichier résident : Windows.res

Structure NMDATETIMEFORMAT     Taille :37
Fichier résident : Windows.res


residents lib utilisateurs:

Structure FSOUND_TOC_TAG     Taille :1195
Fichier résident : FMOD374_CONSTS_STRUCTS.res

Structure REGEXP     Taille :15
Fichier résident : PBRegExpEx.res

Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Voici toutes les structures qui contiennet au moins un byte (le critère de recherche est sur la présence d'un byte sur au moins un élément); de cette liste j'ai retiré les structures du message précédant

Code : Tout sélectionner

Lib PB :

Structure DCB     Taille :28
Fichier résident : Windows.res

Structure ACL     Taille :8
Fichier résident : Windows.res

Structure ACE_HEADER     Taille :4
Fichier résident : Windows.res

Structure SECURITY_DESCRIPTOR     Taille :22
Fichier résident : Windows.res

Structure LDT_BYTES     Taille :4
Fichier résident : Windows.res

Structure CPINFO     Taille :6
Fichier résident : Windows.res

Structure RGBQUAD     Taille :4
Fichier résident : Windows.res

Structure PALETTEENTRY     Taille :4
Fichier résident : Windows.res

Structure LOGFONT     Taille :60
Fichier résident : Windows.res

Structure PANOSE     Taille :10
Fichier résident : Windows.res

Structure OUTLINETEXTMETRIC     Taille :208
Fichier résident : Windows.res

Structure MENUITEMTEMPLATE     Taille :5
Fichier résident : Windows.res

Structure MULTIKEYHELP     Taille :258
Fichier résident : Windows.res

Structure CRGB     Taille :4
Fichier résident : Windows.res

Structure SYSTEM_POWER_STATUS     Taille :12
Fichier résident : Windows.res

Structure PIXELFORMATDESCRIPTOR     Taille :40
Fichier résident : Windows.res

Structure IMAGE_OPTIONAL_HEADER     Taille :224
Fichier résident : Windows.res

Structure TBBUTTON     Taille :20
Fichier résident : Windows.res

Structure TBBUTTONINFOA     Taille :32
Fichier résident : Windows.res

Structure TBBUTTONINFOW     Taille :32
Fichier résident : Windows.res

Structure CHARFORMAT     Taille :60
Fichier résident : Windows.res

Structure ICMP_HDR     Taille :9
Fichier résident : Windows.res

Structure IP_HDR     Taille :20
Fichier résident : Windows.res

Structure ICMP_OPTIONS     Taille :8
Fichier résident : Windows.res




Lib utilisateurs :

Structure VARIANT     Taille :16
Fichier résident : Variant_inc.res

Structure SIGNSCALE     Taille :2
Fichier résident : Variant_inc.res
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

En effet, toute structure API impaire est par definition suspecte. Je vais regarder les structures que tu as mise en relief et voir si y'a une erreur. Pour les autres structures (PB, lib utilisateur) ca n'a pas d'importance car PB n'en tient pas compte.
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

NEWTEXTMETRIC, MENUITEMTEMPLATE

DDEDATA, DDEPOKE, DDEUP etaient mal declarés (a cause des flags 'bit' du type C)

NMCBEENDEDIT, NMDATETIMEFORMAT, etaient mal declarée..

Je pense qu'il serait utile de faire un petit program qui genere 2 fichiers: le fichier PB sous la forme

OpenFile("c:\result.pb")
WriteStringN(Str(sizeof(STRUT1)))
WriteStringN(Str(sizeof(STRUT2)))
WriteStringN(Str(sizeof(STRUT3)))
..

et ce pour toutes les structures API

ansi que le fichier C:

main()
{
printf("%d\n", sizeof(STRUC1));
printf("%d\n", sizeof(STRUC2));
printf("%d\n", sizeof(STRUC3));
}

Ainsi on aura 2 ficheirs qui pourront valider les tailles des structures PB. Ca devrait eliminer la majorité des bugs.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Fred a écrit :En effet, toute structure API impaire est par definition suspecte. Je vais regarder les structures que tu as mise en relief et voir si y'a une erreur. Pour les autres structures (PB, lib utilisateur) ca n'a pas d'importance car PB n'en tient pas compte.
Pour les structures avec une taille paire, le C ajoute un octet de padding après chaque élément de type byte ? (je suppose que oui sinon on est plus aligné en adresse)
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

En fait ca depend de la directive de compilation (#pragma pack). Apparement c'est pas sur un word mais sur un int que ca pad. Dans la structure NEWTEXTMETRIC j'avais une difference de 3 octets. Donc:

en C:

Code : Tout sélectionner

struct
{
  char letter;
  int    test;
};
sera en PB:

Code : Tout sélectionner

Structure
  letter.b
  pad.b[3]
  test.l
EndStructure
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

c'est la même chose pour les 16 bits short, ushort, word ?

et pour les 8 bits Char, Uchar ?
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

J'ai bien l'impression..
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Fred a écrit :En fait ca depend de la directive de compilation (#pragma pack). Apparement c'est pas sur un word mais sur un int que ca pad. Dans la structure NEWTEXTMETRIC j'avais une difference de 3 octets. Donc:

en C:

Code : Tout sélectionner

struct
{
  char letter;
  int    test;
};
sera en PB:

Code : Tout sélectionner

Structure
  letter.b
  pad.b[3]
  test.l
EndStructure
Fred, Je me pose encore des questions sur ce problème. Tu dis que le padding dépend de la directive de compilation et c'est là que je ne comprend plus :roll:

Simplement, en fonction de ta directive de compilation, les résidents vont se trouver avec un padding de 3 (voire 1) ou sans padding. Jusque là je comprend. La ou je ne saisis pas c'est comment windows gère ses propres structures; Comment MS peut savoir si le padding est de 0, 1 ou 3 ?

Pour moi, windows a surement établi une règle pour ses propres structures une fois pour toute, car au retour d'un API, il faut bien savoir exactement ou sont les éléments de la structure.
Si c'est le cas, les résidents doivent suivre cette règle.
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

En fait on trouve des #pragma pack(4) etc. dans les headers, c'est ca qui fait l'alignement des structures. En principe la plupart des structures alignes sur la taille de l'element qui suit. Si c'est un long, il sera aligné à 4, si c'est un word, à 2 etc..
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ouf,

je n'en dormais plus :mrgreen:

Merci Fred
Répondre