Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi wert eines Pointers ermitteln (https://www.delphipraxis.net/117473-wert-eines-pointers-ermitteln.html)

Marco Steinebach 18. Jul 2008 18:19


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:
procedure EndOfStream (user: Pointer); stdcall;
Wie kriege ich mein Fensterhandle nu in die Procedur rein, und, wie kriege ich es innerhalb der Prozedur wieder raus?
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

mkinzler 18. Jul 2008 18:26

Re: wert eines Pointers ermitteln
 
Bist du sicher, das die Prozedur ein Handle erwartet?

DeddyH 18. Jul 2008 18:30

Re: wert eines Pointers ermitteln
 
Ein Cast sollte zumindest den Compiler zufrieden stellen.
Delphi-Quellcode:
EndOfStream(Pointer(self.Handle));
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:

rollstuhlfahrer 18. Jul 2008 20:37

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:
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;
Bernhard

Apollonius 18. Jul 2008 20:42

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.

rollstuhlfahrer 18. Jul 2008 20:49

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

Apollonius 18. Jul 2008 20:51

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.

Marco Steinebach 19. Jul 2008 08:51

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 08:52 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