Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Definition von MONITORINFOEX falsch? (https://www.delphipraxis.net/129086-definition-von-monitorinfoex-falsch.html)

Union 12. Feb 2009 14:20


Definition von MONITORINFOEX falsch?
 
Beim Versuch, eine erweiterte Monitorinfo inklusive dem Devicenamen zu erhalten war ich lange erfolglos. Wie man sieht, hat die erweiterte Struktur genau ein Feld mit 32 Byte mehr als die "Kurzversion":
Delphi-Quellcode:

  tagMONITORINFOA = record
    cbSize: DWORD;
    rcMonitor: TRect;
    rcWork: TRect;
    dwFlags: DWORD;
  end;

  CCHDEVICENAME = 32;
 
  tagMONITORINFOEXA = record
    cbSize: DWORD;
    rcMonitor: TRect;
    rcWork: TRect;
    dwFlags: DWORD;
    szDevice: array[0..CCHDEVICENAME] of AnsiChar;
  end;
Beim Füllen von cbSize vor dem Aufruf von GetMonitorInfo habe ich SizeOf verwendet. Dabei ergibt
Delphi-Quellcode:
SizeOf(TMonitorInfo)  -> 40
SizeOf(TMonitorInfoEx) -> 76
Da die Struktur aber maximal 72 Byte groß sein darf, lehnt GetMonitorInfo die Ausführung mit GetLastError 87 (Falscher Parameter) ab. Jetzt kann man natürlich einfach 4 abziehen um cbSize zu füllen, aber schön ist das nicht. Sollte die Record-Definition evtl. eher ein packed record sein?

Uwe Raabe 12. Feb 2009 14:40

Re: Definition von MONITORINFOEX falsch?
 
Ich würde eher vermuten, daß ein Array[0..32] of AnsiChar nicht 32 sondern 33 Byte groß ist und somit den Record wegen des Align auf 76 Byte bringt.

Bei meinem Delphi 2007 ist die Deklaration auch entsprechend:

Delphi-Quellcode:
 
tagMONITORINFOEXA = record
  cbSize: DWORD;
  rcMonitor: TRect;
  rcWork: TRect;
  dwFlags: DWORD;
  szDevice: array[0..CCHDEVICENAME - 1] of AnsiChar;
end;

Union 12. Feb 2009 14:42

Re: Definition von MONITORINFOEX falsch?
 
Das könnte es sein. Aber es MUSS 72 übergeben werden als cbSize, bei 73 gibt es den gleichen Fehler.

Assertor 12. Feb 2009 14:59

Re: Definition von MONITORINFOEX falsch?
 
Hi,

Zitat:

Zitat von Union
Das könnte es sein. Aber es MUSS 72 übergeben werden als cbSize, bei 73 gibt es den gleichen Fehler.

Wird es doch mit der korrekten Deklaration die Uwe genannt hat.

Zitat:

Zitat von Uwe Raabe
Ich würde eher vermuten, daß ein Array[0..32] of AnsiChar nicht 32 sondern 33 Byte groß ist und somit den Record wegen des Align auf 76 Byte bringt.

Dadurch das szDevice gefixt wurde und nun array[0..CCHDEVICENAME - 1] lautet, wird der Record nicht um weitere 4 Bytes vergrößert (76-4 Byte). Die 76 Byte liegen halt an dem zu großen Array (1 AnsiChar bzw. Byte zu viel) - wegen des Aligns wird, wie Uwe korrekt vermutet der Record dann fälschlicherweise von 72+1 Byte auf 76 Byte vergrößert.

Welche Delphi Version nutzt Du? Das ganze ist im QC gemeldet für D5-D7, gefixt für D10 also Delphi 2006 (Link: http://qc.codegear.com/wc/qcmain.aspx?d=3239).

Gruß Assertor

Muetze1 12. Feb 2009 15:28

Re: Definition von MONITORINFOEX falsch?
 
Ach, mein alter QC Eintrag. Ein schönes Beispiel wie lange QC für eine Fehlerbehebung braucht - obwohl man komplett korrigierten QC meldet. Copy & Paste dauert halt locker mal ein paar Jahre...

Assertor 12. Feb 2009 15:35

Re: Definition von MONITORINFOEX falsch?
 
Hi Muetze,

Zitat:

Zitat von Muetze1
Ach, mein alter QC Eintrag. Ein schönes Beispiel wie lange QC für eine Fehlerbehebung braucht - obwohl man komplett korrigierten QC meldet. Copy & Paste dauert halt locker mal ein paar Jahre...

Waren doch nur 4-5 Delphi Versionen bis es gefixt wurde ;) Liegt aber sicherlich auch daran das 1) das QC viel zu voll ist und dringen entrümpelt werden müsste (meinetwegen alles Alte in ein Archiv) und 2) viel zu wenig Leute sich anmelden und auch voten.

Außerdem fehlen mehrere Eskalationsstufen etc. pp. Aber da wird ja bei CG vieles bereits umstruktuiert. Mal sehen was irgendwann mal draus wird.

Das es aber häufig keinen Zweck hat darauf zu hoffen, sieht man an jbg's notwendigen Werken.

Gruß Assertor


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz