Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Objekt-Zeiger in einem String-Parameter "transportiere"? (https://www.delphipraxis.net/198507-objekt-zeiger-einem-string-parameter-transportiere.html)

uups 8. Nov 2018 11:15

Objekt-Zeiger in einem String-Parameter "transportiere"?
 
Hallo! Ich habe eine Funktion auszuführen (zu der ich leider kein Quellcode besitze), die mehrere Sting-Parameter enthält. Nach der Ausführung der Funktion wird ein Event ausgelöst, der einige dieser Strings wieder zum Abruf bereitstellt.

Wäre es ohne Weiteres möglich, einem String-Parameter ein Pointer auf ein Objekt zuzuweisen und diesen String dann wieder in den Pointer zu konvertieren? Eigentlich stelle ich mir ein Pointer als ein Integer vor:

Delphi-Quellcode:
s := IntToStr(integer(Pointer(MyObject)));


und dann

Delphi-Quellcode:
Obj := TMyObject(Pointer(StrToInt(s)));


sollte eigentlich klappen, tut es aber nicht und meldet eine AV bei der Umwandlung des Strings zurück in den Pointer. Was mache ich falsch?

ghubi01 8. Nov 2018 11:44

AW: Objekt-Zeiger in einem String-Parameter "transportiere"?
 
Hallo,

eventuell so:
Delphi-Quellcode:
type
  TMyObj = class(TObject)
  private
    FStr: string;
  end;
...

procedure TForm1.Button1Click(Sender: TObject);
var
  MyObj1, MyObj2: TMyObj;
  PMyObj2: ^TMyObj;
  s: String;
begin
  MyObj1:=TMyObj.Create;
  MyObj1.FStr:='Hallo';

  s:=IntToStr(integer(@MyObj1));
  PMyObj2:=Pointer(StrToInt(s));
  MyObj2:=PMyObj2^;

  Memo1.Lines.Add(MyObj2.FStr);

  MyObj1.Free;
end;

Zacherl 8. Nov 2018 13:20

AW: Objekt-Zeiger in einem String-Parameter "transportiere"?
 
Niemals
Delphi-Quellcode:
Integer
für Pointer Casts verwenden, sondern
Delphi-Quellcode:
NativeUInt
/
Delphi-Quellcode:
UIntPtr
. Sonst hast du unter 64-Bit ganz schnell ein Problem.

ghubi01 8. Nov 2018 14:08

AW: Objekt-Zeiger in einem String-Parameter "transportiere"?
 
Hallo Zacherl,

Du hast Recht. Ich bin auch noch von einer 32-Bit Umgebung ausgegangen.
So müsste es besser sein.
Delphi-Quellcode:
  ...
  s:=UIntToStr(NativeUInt(@MyObj1));
  PMyObj2:=Pointer(StrToUInt(s));
  ...

uups 9. Nov 2018 09:35

AW: Objekt-Zeiger in einem String-Parameter "transportiere"?
 
Perfekt, vielen Dank!


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2018 by Daniel R. Wolf