Page 1 sur 1

Structure ACCEL

Publié : lun. 27/déc./2004 20:23
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

Publié : dim. 15/mai/2005 21:44
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.

Publié : lun. 16/mai/2005 5:33
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é)

Publié : lun. 16/mai/2005 7:17
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


Publié : lun. 16/mai/2005 7:50
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

Publié : lun. 16/mai/2005 12:36
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.

Publié : lun. 16/mai/2005 13:12
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.

Publié : lun. 16/mai/2005 13:30
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)

Publié : lun. 16/mai/2005 16:20
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

Publié : lun. 16/mai/2005 17:08
par Anonyme2
c'est la même chose pour les 16 bits short, ushort, word ?

et pour les 8 bits Char, Uchar ?

Publié : lun. 16/mai/2005 17:25
par Fred
J'ai bien l'impression..

Publié : mer. 18/mai/2005 16:45
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.

Publié : mer. 25/mai/2005 17:24
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..

Publié : mer. 25/mai/2005 18:28
par Anonyme2
Ouf,

je n'en dormais plus :mrgreen:

Merci Fred