Erreur sur la taille de la structure MONITORINFOEX

Sujets variés concernant le développement en PureBasic
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Erreur sur la taille de la structure MONITORINFOEX

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Erreur sur la taille de la structure MONITORINFOEX

Message 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;
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Erreur sur la taille de la structure MONITORINFOEX

Message par Anonyme2 »

Ok Nico et merci,

je vais installer la dernière beta et tester
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Erreur sur la taille de la structure MONITORINFOEX

Message 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.
Fred
Site Admin
Messages : 2652
Inscription : mer. 21/janv./2004 11:03

Re: Erreur sur la taille de la structure MONITORINFOEX

Message 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 !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Erreur sur la taille de la structure MONITORINFOEX

Message par Anonyme2 »

Trop fort ce Fred :mrgreen:

La correction est Ok avec la beta 4 :D
Répondre