![]() |
wert eines Pointers ermitteln
Hallo,
ähm, ich schähm mich ja schon fast, ;-), aber jetz hab ich alles durcheinander gebracht: meine Klasse hat ein Fensterhandle. Dieses muß einer Prozedur übergeben werden, die als, tja, freien Parameter, einen vom typ Pointer hat. Die Prozedur gehört aber nicht zu meiner Klasse (übrigens auch nur deshalb, weil der Compiler jammert, daß ein Methodenzeiger kein realer Prozeduraufruf ist, hat er ja recht). also:
Delphi-Quellcode:
Wie kriege ich mein Fensterhandle nu in die Procedur rein, und, wie kriege ich es innerhalb der Prozedur wieder raus?
procedure EndOfStream (user: Pointer); stdcall;
also, mal angenommen, mein fensterhadle heißt h: [delphi] EndOfStream (h); {/delphi] geht logischerweise nicht, weil pointer und HWND nicht das gleich sind. Ich steh völlig auf dem Schlauch - umschreiben der Prozedur geht nicht, weil's eine vorgegebene CallBack-Routine ist. Ähm, kann mir mal jemand beim aufrollen helfen? Vielen Dank schonmal und viele Grüße Marco |
Re: wert eines Pointers ermitteln
Bist du sicher, das die Prozedur ein Handle erwartet?
|
Re: wert eines Pointers ermitteln
Ein Cast sollte zumindest den Compiler zufrieden stellen.
Delphi-Quellcode:
Aber ob das so richtig ist, wage ich auch zu bezweifeln. Wenn ein Handle erwartet würde, wäre der Parameter bestimmt vom Typ HWND :gruebel:
EndOfStream(Pointer(self.Handle));
|
Re: wert eines Pointers ermitteln
HI,
wenns ne eigene Prozedur ist, dann kannst du auch den Typ ändern um das ganze einfacher zu machen. Falls nicht, würde ich vorschlagen einen typisierten Pointer zu nehmen. Den Wert bekommst du (nur beim typisierten) mit Pointer^. Beispiel
Delphi-Quellcode:
Bernhard
procedure Test(Wert: Pointer);
begin showmessage(IntToStr(Integer(Wert)) + '; ' + IntToStr(PCardinal(Wert)^)); end; procedure TForm1.Button1Click(Sender: TObject); var x1: HWND; x2: PCardinal; begin x1 := self.Handle; x2 := @x1; Test(x2); end; |
Re: wert eines Pointers ermitteln
Das ist doch viel zu kompliziert. SizeOf(Pointer) = SizeOf(HWND), also kann man einfach casten: EndOfStream(Pointer(Handle)) und in der Routine dann HWND(User).
Bernhards Lösung geht natürlich auch, allerdings funktioniert das nicht, falls der Wert nach dem Aufruf noch gebraucht wird - bei CreateThread ist das zum Beispiel so. |
Re: wert eines Pointers ermitteln
war halt etwas schnell dahingeschrieben. Mit Pointern hab ich mich noch nicht eindringlich beschäftigt. Aber mit siizeof(Pointer) = sizeof(HWND) hast du recht, da das beides 32Bit-Integer sind.
Kann man einen Pointer mit new() langlebiger machen? Bernhard |
Re: wert eines Pointers ermitteln
Ja, aber das wäre hier nicht ratsam. Speicherallozierung ist aufwendig und hat bei Anwendungen mit mehreren Threads noch weitere Implikationen, da Locks verwendet werden müssen.
|
Re: wert eines Pointers ermitteln
Hallo zusammen,
herzlichen Dank für die vielen, raschen und absolut sinnigen Antworten. Nein, die Prozedur (übrigens aus der bass.dll) erwartet kein Handle, sondern einen Parameter, mit dem der User machen kann, was er will. Bei mir ist's ein Handle, weil ich in dieser SyncProzedur eine Message schicken muß, und das handle brauche, wohin sie soll. Aber am typ ändern kann man nix. Die Cast-Lösung (pointer(handle)) und wieder zurück funktioniert einwandfrei. Ich hatte mic daß nur nicht getraut, weil pointer immer sowas von (du schreibst gerade im Hauptspeicher rum) haben. ;-) Vielen Dank nochmal und viele Grüße Marco |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz