Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi GetWindowLongPtr Result NIL (https://www.delphipraxis.net/197659-getwindowlongptr-result-nil.html)

EWeiss 25. Aug 2018 04:17

GetWindowLongPtr Result NIL
 
Subclassing erstellen mit 32BIT Anwendung kein Problem diese Funktion liefert immer einen gültigen Pointer.
Delphi-Quellcode:
function DialogNotifyProc(WinHandle: HWND; Msg: UINT; wp: WPARAM; lp: LPARAM): LRESULT; stdcall;
//...
DlgHandle := GetParent(WinHandle);
//...
FPrevDlgProc := Pointer(GetWindowLongPtr(DlgHandle, DWL_DLGPROC));
SetWindowLongPtr(DlgHandle, DWL_DLGPROC, LONG_PTR(@DlgProc));
Das Handle ist gültig.
Aber nicht mit 64Bit. Pointer ist NIL das verstehe wer will. :evil:

ZITAT:
Zitat:

Ersetzen Sie SetWindowLong/GetWindowLog durch SetWindowLongPtr/GetWindowLongPtr für GWLP_HINSTANCE, GWLP_ID, GWLP_USERDATA, GWLP_HWNDPARENT und GWLP_WNDPROC, da sie Zeiger und Handles zurückgeben. Zeiger, die an SetWindowLongPtr übergeben werden, sollten in den Typ LONG_PTR und nicht in Integer/Longint umgewandelt werden.

Richtig:
SetWindowLongPtr(hWnd, GWLP_WNDPROC, LONG_PTR(@MyWindowProc));
Falsch:
SetWindowLong(hWnd, GWL_WNDPROC, Longint(@MyWindowProc));
gruss

Dalai 25. Aug 2018 04:47

AW: GetWindowLongPtr Result NIL
 
Beachte die Parameter der Funktion MSDN-Library durchsuchenGetWindowLongPtr: DWLP_DLGPROC. Ist bestimmt eine andere Konstante.

Und nutze GetLastError, wenn was nicht passt, um herauszufinden, woran es klemmt! Noch kann ich zählen, wie oft ich diese Empfehlung bereits gegeben habe.

PS: Sorry, falls die Empfehlung dich nerven sollte, aber du bist lange genug dabei, dass du es eigentlich bereits wissen solltest.

Grüße
Dalai

EWeiss 25. Aug 2018 04:56

AW: GetWindowLongPtr Result NIL
 
Zitat:

Zitat von Dalai (Beitrag 1411601)
Beachte die Parameter der Funktion MSDN-Library durchsuchenGetWindowLongPtr: DWLP_DLGPROC. Ist bestimmt eine andere Konstante.

Und nutze GetLastError, wenn was nicht passt, um herauszufinden, woran es klemmt! Noch kann ich zählen, wie oft ich diese Empfehlung bereits gegeben habe.

PS: Sorry, falls die Empfehlung dich nerven sollte, aber du bist lange genug dabei, dass du es eigentlich bereits wissen solltest.

Grüße
Dalai

Diese Konstante gibt es in Delphi nicht.
Dort kenne ich nur DWL_DLGPROC

Zitat:

Sorry, falls die Empfehlung dich nerven sollte
Kein problem ;)
Aber auch ein GetLastError hätte mir nicht weitergeholfen woher sollte ich wissen das es eine andere Konstante gibt?
Danke!

PS:
Habe es gefunden aber nicht in den Delphi Headern..
Delphi-Quellcode:
DWLP_DLGPROC = Sizeof(LRESULT);


Verstehe ich nicht aber gut ist wie es ist.
Funktioniert mit 32Bit und 64

Winapi.Windows..
32 Bit
Delphi-Quellcode:
  { GetSetWindowWordLong offsets for use with WC_DIALOG windows }
  {$EXTERNALSYM DWL_MSGRESULT}
  DWL_MSGRESULT = 0;
  {$EXTERNALSYM DWL_DLGPROC}
  DWL_DLGPROC = 4;
  {$EXTERNALSYM DWL_USER}
  DWL_USER = 8;
Das wars.
Und für 64BIt
Delphi-Quellcode:
//64-Bit longpointer constants

const
  {$EXTERNALSYM GWLP_WNDPROC}
  GWLP_WNDPROC = -4;
  {$EXTERNALSYM GWLP_HINSTANCE}
  GWLP_HINSTANCE = -6;
  {$EXTERNALSYM GWLP_HWNDPARENT}
  GWLP_HWNDPARENT = -8;
  {$EXTERNALSYM GWLP_USERDATA}
  GWLP_USERDATA = -21;
  {$EXTERNALSYM GWLP_ID}
  GWLP_ID = -12;
gruss

KodeZwerg 25. Aug 2018 07:46

AW: GetWindowLongPtr Result NIL
 
Seltsam,SetWindowLongPtr da steht in Erklärung das ein GetLastError eigentlich Dir helfen sollte, sofern man per SetLastError vorher nullt.

EWeiss 25. Aug 2018 07:51

AW: GetWindowLongPtr Result NIL
 
Zitat:

Zitat von KodeZwerg (Beitrag 1411606)
Seltsam,SetWindowLongPtr da steht in Erklärung das ein GetLastError eigentlich Dir helfen sollte, sofern man per SetLastError vorher nullt.

Ja sehr..

Sagt mir GetLastError das ich die falsche Konstante (für 64Bit) verwende (32Bit geht ja) und welche ich nutzen muss?
Denke mal nicht. (Aber vielleicht liest diese es mir auch noch vor, man weis ja nie und man darf ja träumen)
Es spuckt vielleicht einen Invaliden Parameter als Fehlermeldung aus aber das war es dann auch schon.
Damit weis ich aber immer noch nicht welche Konstante ich verwenden muss zumal sie in den Headern von Delphi gar nicht existiert.
Also woher nehmen und nicht stehlen.

Sorry ne Glaskugel habe ich nicht.
Aber das Thema ist ja dank @Dalai Informationen erledigt.

gruss

Dalai 25. Aug 2018 17:10

AW: GetWindowLongPtr Result NIL
 
Zitat:

Zitat von EWeiss (Beitrag 1411602)
Aber auch ein GetLastError hätte mir nicht weitergeholfen woher sollte ich wissen das es eine andere Konstante gibt?

Der Name der Konstante steht doch im MSDN-Artikel. Zugegeben ist der Unterschied lediglich im P, was man leicht übersehen kann. Welchen Wert die Konstante hat, sofern der in den Delphi-Headern fehlt, bekommt man mit ein bisschen Suchmaschinen-Tätigkeit raus. Das hab ich für mein Delphi 5 schon häufiger machen müssen, insofern weiß ich, wovon ich rede. In diesem Fall ist das aber gar nicht nötig, weil der Wert im MSDN-Artikel schon gegeben ist.

GetLastError kann schon Hinweise geben, z.B. auf einen ungültigen Parameter oder ähnliches.

Zitat:

Danke!
Büddeschön.

Grüße
Dalai

EWeiss 25. Aug 2018 17:25

AW: GetWindowLongPtr Result NIL
 
Zitat:

GetLastError kann schon Hinweise geben, z.B. auf einen ungültigen Parameter oder ähnliches.
Da stimme ich dir zu;)

Aber wie gesagt ich stand erst mal auf dem Schlauch.
Das erste was man tut ist in den Headern zu schauen und das ist nun mal Winapi.Windows aber da war nichts.
Auf der anderen Seite.. GetWindowLongPtr gibt es nicht erst seit gestern ist also schon verwunderlich das solche trivialen Dinge nicht im Header stehen.

Sorry habe im Moment so viele Baustellen um meine LIB auf 64Bit umzustellen das ich nicht daran gedacht habe mal die API selbst zu durchleuchten. (DuckDuck und go..)
Also Danke nochmals.

Zitat:

GetLastError kann schon Hinweise geben, z.B. auf einen ungültigen Parameter oder ähnliches.
Hatte ich ja auch geschrieben.. wie gesagt grundsätzlich gebe ich dir recht. ;)

PS:
Habe jetzt 8 Anwendungen schon nach 64Bit umgelegt bis auf eine die 25% CPU Auslastung mit 64Bit produziert laufen sie alle.
Kommt immer wieder etwas dazu das ich fixen muss aber gut was soll's.
Also nächstes kommt KVPlayer an der reihe. ;)


gruss


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