AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Pointer in Property schreiben
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer in Property schreiben

Ein Thema von EWeiss · begonnen am 21. Aug 2018 · letzter Beitrag vom 21. Aug 2018
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Pointer in Property schreiben

  Alt 21. Aug 2018, 09:30
Delphi-Quellcode:
procedure TSkinEngine.SetProperty(WinHandle: HWND; Item: integer; V: LONG_PTR);
begin

    if (Item > 0) and (Item < EXTEND_EXTRA + 1) and (WinHandle <> 0) then
      SetWindowLongPtr(WinHandle, (Item - 1) * 4, V);

end;
Unter 32Bit werden mir immer die korrekten Pointer zurückgegeben.

Delphi-Quellcode:
function TSkinEngine.GetProperty(WinHandle: HWND; Item: integer): LONG_PTR;
begin
  Result := 0;

  if (Item > 0) and (Item < EXTEND_EXTRA + 1) and (WinHandle <> 0) then
    Result := GetWindowLongPtr(WinHandle, (Item - 1) * 4);

end;
Delphi-Quellcode:
      ImgTL := Pointer(GetProperty(pHandle, FORM_TopRight));
      if Assigned(ImgTL) then
        GetImageSize(ImgTL, TLW, TLH);
unter 64Bit ist alles irgendwie durcheinander die Pointer stimmen einmal dann wieder nicht.
Ist LONG_PTR für 64Bit nicht das richtige?

Die Daten werden so übergeben.

Delphi-Quellcode:
              stTopRight:
              begin
                Path := FSkinPath(sBF, sSkinPath);
                if FileExists(Path) then
                  SkinEngine.SetProperty(hMain, FORM_TopRight,
                    LONG_PTR(SkinEngine.skCreateImageFromFile(Path)));
              end;
Funktioniert alles in 32Bit in 64Bit jedoch nicht.

pic 1. Der Pointer vom Image
pic 2. konvertiert zu LONG_PTR
pic 3. Die Rückgabe.. komplett falsch

Danach kracht es weil der Pointer falsch ist.

gruss

Geändert von EWeiss (11. Jul 2019 um 16:53 Uhr)
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Pointer in Property schreiben

  Alt 21. Aug 2018, 09:50
eventuell liegt das an deinem (Item - 1) * 4 ? Dieser Parameter ist ja nur ein Index kann also fortlaufend sein (z.B.: 0,1,2,...) wenn dann dadurch die Größe deines ExtraByte-Feldes (z.B.: SizeOf(LONG_PTR)*x) überschritten wird könnte es zu diesem Effekt kommen.
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Pointer in Property schreiben

  Alt 21. Aug 2018, 09:52
eventuell liegt das an deinem (Item - 1) * 4 ? Dieser Parameter ist ja nur ein Index kann also fortlaufend sein (z.B.: 0,1,2,...) wenn dann dadurch die Größe deines ExtraByte-Feldes (z.B.: SizeOf(LONG_PTR)*x) überschritten wird könnte es zu diesem Effekt kommen.
Nun dann müsste es auch unter 32Bit krachen oder nicht?
Das tut es aber seit mehr als 6 Jahren nicht es werden immer die korrekten Pointer zurück geliefert.

bsp.
Item := FORM_TopRight = 4
bei
SetWindowLongPtr(WinHandle, (Item - 1) * 4, V);
ist das Item = 12

Wenn ich die property zurück lese
dann ist item
ImgTR := Pointer(GetProperty(pHandle, FORM_TopRight));

FORM_TopRight := 4 = (Item - 1) * 4 = 12
Es ist also in jedem fall der gleiche Index.
Aber die werte die abgespeichert wurden stimmen nicht unter 64Bit.

GetProperty liest die werte so zurück wie si von SetProperty übergeben wurden.

gruss

Geändert von EWeiss (21. Aug 2018 um 10:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

AW: Pointer in Property schreiben

  Alt 21. Aug 2018, 10:04
Weil unter Win32 ein LONG_PTR 4 Byte groß ist. Unter Win64 sind das aber 8, daher ist diese Magic Number schlicht falsch. Was spricht denn dagegen, wie vorgeschlagen SizeOf zu verwenden?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Pointer in Property schreiben

  Alt 21. Aug 2018, 10:08
Weil unter Win32 ein LONG_PTR 4 Byte groß ist. Unter Win64 sind das aber 8, daher ist diese Magic Number schlicht falsch. Was spricht denn dagegen, wie vorgeschlagen SizeOf zu verwenden?
Dann würde sich doch anbieten eine Magic number Type zu verwenden die in der Byte Anzahl gleich ist oder?

Deshalb ja meine frage
muss mal sehen ob Int64 bei beiden gleich groß ist.

Nee wenn dann Long ist das gleiche wie integer in 32Bit.
Werde es mal testen.

PS:
Ein einfache Integer sollte auch reichen es muss nur zwingend 4Byte sein.
Denke damit ist das Thema erledigt Danke bin schon etwas weiter.

gruss

Geändert von EWeiss (21. Aug 2018 um 10:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:41 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