AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Definition von MONITORINFOEX falsch?

Definition von MONITORINFOEX falsch?

Ein Thema von Union · begonnen am 12. Feb 2009 · letzter Beitrag vom 12. Feb 2009
Antwort Antwort
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#1

Definition von MONITORINFOEX falsch?

  Alt 12. Feb 2009, 13:20
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?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.367 Beiträge
 
Delphi 12 Athens
 
#2

Re: Definition von MONITORINFOEX falsch?

  Alt 12. Feb 2009, 13:40
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;
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Definition von MONITORINFOEX falsch?

  Alt 12. Feb 2009, 13:42
Das könnte es sein. Aber es MUSS 72 übergeben werden als cbSize, bei 73 gibt es den gleichen Fehler.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#4

Re: Definition von MONITORINFOEX falsch?

  Alt 12. Feb 2009, 13:59
Hi,

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 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
Frederik
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Definition von MONITORINFOEX falsch?

  Alt 12. Feb 2009, 14:28
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...
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#6

Re: Definition von MONITORINFOEX falsch?

  Alt 12. Feb 2009, 14:35
Hi Muetze,

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
Frederik
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz