LONG_PTR und structs
-
Hi,
ich habe daten in einem struct,
dessen inhalt wollte ich nicht unbedingt integerweise in den Speicher des Fensters schreiben,So kam ich auf die (vlt etwas bekloppte), idee
SetWindowLongPtr(this->handle,offset,(LONG_PTR)&(this->data))also einfach die Addresse zu kopieren, das klappt leider nicht so wie ich mir das vorstelle,..
grüße
-
Hallo,
so ganz schlau werde ich aus deinem Beitrag nicht. Ich vermute aber: Du willst dem Fenster beim Start eine Struktur, bzw. Daten, mitgeben?
Einem Dialog oder Fenster kann man über dencbWndExtra
Member der WndClass-Struktur Bytes reservieren lassen für das Window oder für alle von dieser Klasse abgeleiteten Windows dann via:
int cbClsExtra
Das können Zeiger sein, Strukturen, wie es beliebt. Diese Daten stehen dann unter GWL_USERDATA bzw. DWL_USER (bei Dialogen) zur Verfügung.
Das Verfahren ist eigentlich recht geschickt, wenn man dem Fenster oder Dialog ein paar zusätzliche Startwerte mitgeben will.
-
den speicher hatte schon via cbWndExtra reserviert,
das auslesen und schreiben via Get/SetWindowLong funzt auch für jedes window,
Mir gehts explicit um die Verwendung von Get/SetWindowLongPtr und meinen struct,
denn ich will nicht per SetWindowLong jeden Integer einzel übergeben, besonders in dem fall nicht wenn das eine größere struktur ist,...
Sei gegrüßt
-
Hallo,
offensichtlich geht das in den 64Bit Bereich. Leider habe ich damit noch keine Erfahrungen, was die WinAPI-Umsetzung dazu macht, da ich weder über einen
64Bit Prozessor noch einem Win32/64 verfüge.
Möge ein mit solch Gerät ausgestatteter Mensch dir posten
-
hehe,
Ich glaube das auch ein paar menschen mit einem win32 system da ahnung habe, aber leider meldet sich da keiner

naja,. ich werde weiter suchen

-
Ich verstehe Deine Frage nicht... WAS klappt denn nicht?
-
Jo Jochen,
die zuweisung des Pointers vom struct per SetWindowLongPtr an den Speicher vom Fenster.
Wenn ich das mache ist der Speicher leider leer, das ist er nicht wenn ich integerweise per SetWindowLong die daten übergebe.
grüße
-
zeusosc schrieb:
die zuweisung des Pointers vom struct per SetWindowLongPtr an den Speicher vom Fenster.
Wenn ich das mache ist der Speicher leider leer, das ist er nicht wenn ich integerweise per SetWindowLong die daten übergebe.
Und! Die Funktionen sind identisch. Was Du sagst kann nicht sein!
SetWindowLongPtr benutzt SetWindowLong...
-
zeusosc schrieb:
hehe,
Ich glaube das auch ein paar menschen mit einem win32 system da ahnung habe, aber leider meldet sich da keiner

naja,. ich werde weiter suchen

das hat weniger mit Ahnung davon zu tun, als der Vorsicht darüber mit wenig Vorinformationen von Dir viel zur Lösung zu sagen
Klar ist ein Pointer in Win64 wie Pointer in Win32 (der eine ist 64 Bit der andere 32 Bit, aber das Prozedere ist nicht viel anderst).Dein Problem kenne ich, nur schreibst Du es auch so nicht hin. Du willst einem Window eine Struktur mit geben - über deren UserData-Member. Leider zerfällt die Struktur, wenn das Win gebaut wurde, stimmt's?
Nun: Die Struktur sollte in einem shared Memory liegen. Den Mem-Handle kannst Du in Userdata übergeben, so sollte es dann eigentlich funktionieren.
-
Also ich weiss auch nicht was hier nicht klappen sollte.
Ob man nun GWLP_USERDATA oder eigene Indizes verwendet sollte egal sein, solange man ggf. entsprechend den nötigen Platz in der WNDCLASS Struktur angibt.
Was hier mit "zerfallen" und "Speicher leer" gemeint ist verstehe ich auch nicht ganz.
Logisch ist, dass, wenn man einen Zeiger mittels SetWindowLongPtr setzt, nicht die Struktur kopiert wird, sondern nur der Zeiger auf die Struktur. Wenn man dann nicht dafür sorgt dass die Struktur lange genug am Leben bleibt dann bekommt man natürlich Probleme, das sollte klar sein. Oder nicht so klar, falls das das Problem gewesen sein sollte
