AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetWindowLongPtr Result NIL

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

n/a Beiträge
 
#1

GetWindowLongPtr Result NIL

  Alt 25. Aug 2018, 04:17
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.

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

Geändert von EWeiss (25. Aug 2018 um 04:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#2

AW: GetWindowLongPtr Result NIL

  Alt 25. Aug 2018, 04:47
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: GetWindowLongPtr Result NIL

  Alt 25. Aug 2018, 04:56
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..
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

Geändert von EWeiss (25. Aug 2018 um 05:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: GetWindowLongPtr Result NIL

  Alt 25. Aug 2018, 07:46
Seltsam,SetWindowLongPtr da steht in Erklärung das ein GetLastError eigentlich Dir helfen sollte, sofern man per SetLastError vorher nullt.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: GetWindowLongPtr Result NIL

  Alt 25. Aug 2018, 07:51
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

Geändert von EWeiss (25. Aug 2018 um 08:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#6

AW: GetWindowLongPtr Result NIL

  Alt 25. Aug 2018, 17:10
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: GetWindowLongPtr Result NIL

  Alt 25. Aug 2018, 17:25
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

Geändert von EWeiss (25. Aug 2018 um 19:42 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 22:40 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