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
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 ,

)
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:
sera en PB:
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:
sera en PB:
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
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
Merci Fred