Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.938 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: WinApi-Aufruf geht in "Release"-Fassung problemlos, bei "Debug" spuckt er Fehler

  Alt 17. Sep 2020, 22:23
In Windows sind ENUMs oft/meistens INT groß,
In Delphi aber so klein, wie möglich, womit dein TPowerRequestType also nur ein Byte ist, anstatt 4 Byte.

Hier kommt es dann drauf an, wie die Speicherausrichtung und Position der Variablen arbeiten, also ob hinter diesem Byte zufällig noch 3 ungenutzte Bytes liegen, gefüllt mit Nullen,
was natürlich von den Einstellungen z.B. der Codeoptimierung abhängt.
Im Debug-Modus liegen Variablen oft auf dem Stack/Heap, damit der Debugger eine feste Stelle zum Auslesen hat, während es im Release auch in die Register wandern kann.

Für TPowerRequestType also unnbedingt mit {$MinEnumSize 4} arbeiten. (leider gibt es kein MinimumSetSize, für sowas braucht man dann eventuell ein , dummy=31); am Ende)

Und beim TReasonContext entweder ein passendes {$ALIGN 4} (Win32 ... Win64 eventuell anders) oder mit PACKED RECORD und eventuellen Füll-Bytes arbeiten,
denn je nach DelphiVersion und Zielplattform ändern sich Grundeinstellungen von $ALIGN schonmal.


PS: Der Typ von POWER_REQUEST_TYPE wird in der Online-Docu nicht genannt, (aber erfahrungsgemäß wird es zu 99.9995% ein INT, UINT oder DWORD sein)
hier kannst dir nur das Windows-SDK runterladen und in der unten genannten Header-Datei "winbase.h" (C++) nachsehn, falls keine andere Quelle so nett ist und das nennt. Bei Google suchenPOWER_REQUEST_TYPE
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (17. Sep 2020 um 22:32 Uhr)
  Mit Zitat antworten Zitat