Page 1 sur 1
Erreur sur la taille de la structure MONITORINFOEX
Publié : mer. 16/déc./2015 16:44
par Anonyme2
A partir du code de Danilo pour lires les structures des résidents, j'ai modifié pour lire toutes les structures en 32/ 64 bit en Ascii/Unicode.
Il y a 683 structures déclarées par PB (5.41 LTS beta 2).
Je n'ai pas trouvé de commande pour lire les tailles des structures, alors j'ai écrit du code pour cela et j'ai comparé mes résultats avec les valeurs de PB (commande sizeof()) afin de voir si j'avais fait des erreurs.
La seule différence est sur la taille de la structure MONITORINFOEX dans les 4 modes, PB retourne toujours 72 alors que l'on devrait avoir 44 ou 48.
Les tailles des structures des résidents sont définies un fois pour toute et non calculées, il y a donc une erreur sur la taille de cette structure, pas sur la déclaration qui est Ok.
Re: Erreur sur la taille de la structure MONITORINFOEX
Publié : mer. 16/déc./2015 18:48
par nico
En version 5.40 LTS 3, donc plus ancienne que la tienne, la fonction fonctionne.
Et on doit avoir un size de 40 pour MONITORINFO ou 72 pour MONITORINFOEX en mode ASCII, soit 40+32=72, voir ci-dessous:
Code : Tout sélectionner
typedef struct tagMONITORINFOEX {
DWORD cbSize;
RECT rcMonitor;
RECT rcWork;
DWORD dwFlags;
TCHAR szDevice[CCHDEVICENAME]; ici CCHDEVICENAME vaut 32 en ascii
} MONITORINFOEX, *LPMONITORINFOEX;
Re: Erreur sur la taille de la structure MONITORINFOEX
Publié : jeu. 17/déc./2015 5:54
par Anonyme2
Ok Nico et merci,
je vais installer la dernière beta et tester
Re: Erreur sur la taille de la structure MONITORINFOEX
Publié : jeu. 17/déc./2015 7:16
par Anonyme2
J'ai installé la dernière beta.
La structure MONITORINFOEX est déclaée comme ceci en PB (windows) que cela soit en 32 ou 64 bit en ascii ou unicode
Code : Tout sélectionner
Structure MONITORINFOEX
cbSize.l
rcMonitor.RECT
rcWork.RECT
dwFlags.l
szDevice.s
EndStructure
avec cette structure, la taille ne pourra jamais atteindre 72 octets.
szDevice est déclarée comme une chaine et devrait occuper 4/8 octets selon la plateforme.
La déclaration de MS (merci Nico) défini szDevice comme un tableau de caractères, un caractère tenant 1 octet en asci et 2 octets en unicode.
J'ai défini une struture MONITORINFOEX_1 conforme à MONITORINFOEX de MS et j'ai utilisé sizeof() en 32/64 bit, Ascii/unicode, avec et sans alignement.
L'alignement ne change pas la taille pour cette structure.
Code : Tout sélectionner
Structure MONITORINFOEX_1
cbSize.l
rcMonitor.RECT
rcWork.RECT
dwFlags.l
szDevice.c[#CCHDEVICENAME]
EndStructure
voici les tailles de la structure MONITORINFOEX_1
; x86 Ascii MONITORINFOEX_1 sans alignement
Taille 72
; x86 Ascii MONITORINFOEX_1 avec Align #PB_Structure_AlignC
Taille 72
; x86 Unicode MONITORINFOEX_1 sans alignement
Taille 104
; x86 Unicode MONITORINFOEX_1 avec Align #PB_Structure_AlignC
Taille 104
; x64 Ascii MONITORINFOEX_1 sans alignement
Taille 72
; x64 Ascii MONITORINFOEX_1 avec Align #PB_Structure_AlignC
Taille 72
; x64 Unicode MONITORINFOEX_1 sans alignement
Taille 104
; x64 Unicode MONITORINFOEX_1 avec Align #PB_Structure_AlignC
Taille 104
La taille de la structure MONITORINFOEX est toujours de 72 octets (32/64 Ascii/Unicode) et est fausse en unicode et sa déclaration l'est également au regard de la taille retournée ainsi que vis-à-vis de la déclaration MS.
Re: Erreur sur la taille de la structure MONITORINFOEX
Publié : jeu. 17/déc./2015 9:53
par Fred
En fait, la structure etait declarée comme ceci:
Code : Tout sélectionner
Structure MONITORINFOEX
cbSize.l
rcMonitor.RECT
rcWork.RECT
dwFlags.l
szDevice.s{#CCHDEVICENAME}
EndStructure
Mais elle n'etait pas mis dans le fichier unicode, donc une seule version etait dispo (et elle devait avoir la bonne taille). Je l'ai changé pour etre plus coherent avec les autres structures:
Code : Tout sélectionner
Structure MONITORINFOEX
cbSize.l
rcMonitor.RECT
rcWork.RECT
dwFlags.l
szDevice.c[#CCHDEVICENAME]
EndStructure
Merci !
Re: Erreur sur la taille de la structure MONITORINFOEX
Publié : jeu. 17/déc./2015 16:46
par Anonyme2
Trop fort ce Fred
La correction est Ok avec la beta 4
