Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Pointer in Property schreiben (https://www.delphipraxis.net/197597-pointer-property-schreiben.html)

EWeiss 21. Aug 2018 08:30


Pointer in Property schreiben
 
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

Whookie 21. Aug 2018 08:50

AW: Pointer in Property schreiben
 
eventuell liegt das an deinem
Delphi-Quellcode:
(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.

EWeiss 21. Aug 2018 08:52

AW: Pointer in Property schreiben
 
Zitat:

Zitat von Whookie (Beitrag 1411180)
eventuell liegt das an deinem
Delphi-Quellcode:
(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.
Delphi-Quellcode:
Item := FORM_TopRight = 4

bei
Delphi-Quellcode:
SetWindowLongPtr(WinHandle, (Item - 1) * 4, V);

ist das Item = 12

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


Delphi-Quellcode:
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

DeddyH 21. Aug 2018 09:04

AW: Pointer in Property schreiben
 
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?

EWeiss 21. Aug 2018 09:08

AW: Pointer in Property schreiben
 
Zitat:

Zitat von DeddyH (Beitrag 1411183)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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