![]() |
WinApi-Aufruf geht in "Release"-Fassung problemlos, bei "Debug" spuckt er Fehler
Liste der Anhänge anzeigen (Anzahl: 3)
Ich rufe die Windows-Routinen
![]() ![]() Lasse ich meine Anwendung als "Release" laufen, funktioniert alles wie gehabt. In "Debug" hingegen wirft mir die WinApi-Routine PowerSetRequest einen System Error 50 - The request is not supported um die Ohren. Wenn ich in der "Debug-Fassung" die Optimierungen einschalte, dann ist in der Debug-Fassung der Fehler auch weg. Ich habe absolut keine Ahnung was das verursacht, wo ich ansetzen muss damit es auch in Debug vernünftig läuft. FastMM meldet keine Speicherfehler, Bereichsüberschreitungen gibt es auch keine. Mein Verdacht ist der variante Record welcher per Zeiger übergeben wird, aber beweisen kann ich es nicht. Kompletter Quellcode im Anhang. Das Problem tritt sowohl bei Delphi 10.0 Seattle, als auch bei 10.4 Sydney auf. Ich konnte nur Win32 testen, Win64 nicht. |
AW: WinApi-Aufruf geht in "Release"-Fassung problemlos, bei "Debug" spuckt er Fehler
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
Delphi-Quellcode:
arbeiten. (leider gibt es kein MinimumSetSize, für sowas braucht man dann eventuell ein
{$MinEnumSize 4}
Delphi-Quellcode:
am Ende)
, dummy=31);
Und beim TReasonContext entweder ein passendes
Delphi-Quellcode:
(Win32 ... Win64 eventuell anders) oder mit PACKED RECORD und eventuellen Füll-Bytes arbeiten,
{$ALIGN 4}
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. ![]() |
AW: WinApi-Aufruf geht in "Release"-Fassung problemlos, bei "Debug" spuckt er Fehler
Zitat:
Vielen Dank. 🎉 Ich glaube da wäre ich nie drauf gekommen. |
AW: WinApi-Aufruf geht in "Release"-Fassung problemlos, bei "Debug" spuckt er Fehler
Zitat:
![]() ![]() Zumindest würde ich es so verstehen. //edit, falsch verstanden beim nochmaligen lesen. Zitat:
Delphi-Quellcode:
TPowerRequestType = (
PowerRequestDisplayRequired = 0, PowerRequestSystemRequired = 1, PowerRequestAwayModeRequired = 2, PowerRequestExecutionRequired = 3); |
AW: WinApi-Aufruf geht in "Release"-Fassung problemlos, bei "Debug" spuckt er Fehler
Zitat:
![]() |
AW: WinApi-Aufruf geht in "Release"-Fassung problemlos, bei "Debug" spuckt er Fehler
Ich war zu voreilig beim posten, hab es bereits korrigiert, sorry für spam.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 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-2025 by Thomas Breitkreuz