AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WinApi-Aufruf geht in "Release"-Fassung problemlos, bei "Debug" spuckt er Fehler

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

Ein Thema von Der schöne Günther · begonnen am 17. Sep 2020 · letzter Beitrag vom 18. Sep 2020
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.167 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

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

  Alt 17. Sep 2020, 21:51
Ich rufe die Windows-Routinen PowerCreateRequest und PowerSetRequest auf.

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.
Angehängte Dateien
Dateityp: pas PowerRequest.pas (2,8 KB, 13x aufgerufen)
Dateityp: pas PowerRequest.Types.pas (1,1 KB, 12x aufgerufen)
Dateityp: dpr PowerRequestsProject.dpr (435 Bytes, 10x aufgerufen)

Geändert von Der schöne Günther (17. Sep 2020 um 22:00 Uhr) Grund: Delphi-Version erwähnt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Sep 2020 um 22:32 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.167 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 18. Sep 2020, 08:29
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

(...)

Für TPowerRequestType also unnbedingt mit {$MinEnumSize 4} arbeiten.
Das ist es!

Vielen Dank. 🎉 Ich glaube da wäre ich nie drauf gekommen.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 18. Sep 2020, 09:03
Der Typ von POWER_REQUEST_TYPE wird in der Online-Docu nicht genannt
PowerSetRequest führt zu REASON_CONTEXT was ich als POWER_REQUEST_TYPE auffasse.

Zumindest würde ich es so verstehen.

//edit, falsch verstanden beim nochmaligen lesen.
Zitat:
PowerRequestDisplayRequired
The display remains on even if there is no user input for an extended period of time.

PowerRequestSystemRequired
The system continues to run instead of entering sleep after a period of user inactivity.

PowerRequestAwayModeRequired
The system enters away mode instead of sleep in response to explicit action by the user. In away mode, the system continues to run but turns off audio and video to give the appearance of sleep.

PowerRequestExecutionRequired
The calling process continues to run instead of being suspended or terminated by process lifetime management mechanisms. When and how long the process is allowed to run depends on the operating system and power policy settings.

On systems not capable of connected standby, an active PowerRequestExecutionRequired request implies PowerRequestSystemRequired.
Also so etwas hier in etwa:
Delphi-Quellcode:
TPowerRequestType = (
  PowerRequestDisplayRequired = 0,
  PowerRequestSystemRequired = 1,
  PowerRequestAwayModeRequired = 2,
  PowerRequestExecutionRequired = 3);
Gruß vom KodeZwerg

Geändert von KodeZwerg (18. Sep 2020 um 09:34 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.615 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

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

  Alt 18. Sep 2020, 09:26
Der Typ von POWER_REQUEST_TYPE wird in der Online-Docu nicht genannt
PowerSetRequest führt zu REASON_CONTEXT was ich als POWER_REQUEST_TYPE auffasse.

Zumindest würde ich es so verstehen.
Noe, REASON_CONTEXT ist ein Record, POWER_REQUEST_TYPE ist ein Enum. Und dessen Größe wird leider nicht angegeben, aber in der WinAPI ist sowas fast immer 32 Bit. (Ist mir aber damals nicht aufgefallen, als ich darüber geblogt habe. Das habe ich gerade korrigiert.)
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 18. Sep 2020, 09:37
Ich war zu voreilig beim posten, hab es bereits korrigiert, sorry für spam.
Gruß vom KodeZwerg
  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 02:11 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