Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Pointer Problem (https://www.delphipraxis.net/207683-pointer-problem.html)

TurboMagic 22. Apr 2021 11:07

Pointer Problem
 
Hallo,

ich schreibe eine DLL und ein Testprogramm.
Die DLL hat eine procedure die einen Pointer bekommt:

Delphi-Quellcode:
procedure DoIt(Num: Byte; Ptr: Pointer);
begin
  // tuwas
end;
Ich rufe die aus einem OnClick Handler testweise auf:

Delphi-Quellcode:
procedure TMainForm.OnCLick(Sender:TObject);
var
  Data : TBytes;
begin
  SetLength(Data, 4);
  Data[0] := 1;
  Data[1] := 2;
  Data[2] := 3;
  Data[3] := 4;

  DoIt(Length(Data), @Data[0]);
end;
Wenn ich mit dem Debugger jetzt schaue was da passiert,
dann zeigt der Ptr in DoIt zwar auf die selbe Speicheradresse
wie @Data[0], aber als Inhalt steht da was ganz anderes drin.

Warum? Was mache ich falsch?

TigerLilly 22. Apr 2021 11:23

AW: Pointer Problem
 
Schau mal da:
http://docwiki.embarcadero.com/RADSt...g_von_Speicher

TurboMagic 22. Apr 2021 13:13

AW: Pointer Problem
 
Hallo,

danke für den Link.
Tja, nach dem die DLL von vielen Leuten mit vielen Sprachen verwendet werden soll
muss ich wohl auf der Aufruferseite den Speicher den ich übergebe mittels GetMem
allokieren und darauf den Zeiger übergeben. Freigabe ich natürlich wieder Sache
des Aufrufers.

Grüße
TurboMagic

Rolf Frei 22. Apr 2021 13:24

AW: Pointer Problem
 
Versuch mal folgendes:

Delphi-Quellcode:
procedure TMainForm.OnCLick(Sender:TObject);
var
  Data : TBytes;
begin
  SetLength(Data, 4);
  Data[0] := 1;
  Data[1] := 2;
  Data[2] := 3;
  Data[3] := 4;

  DoIt(Length(Data), Pointer(Data)); // oder Pointer(Data[0])
end;

TurboMagic 22. Apr 2021 13:29

AW: Pointer Problem
 
Das funktioniert so leider nicht.
Ich baue es jetzt auf Speicher reservieren um.

Rolf Frei 22. Apr 2021 14:13

AW: Pointer Problem
 
Du allozierst da ja eigentlich schon Speicher mit dem SetLength. Ich würde darauf tippen, dass deine DLL eventuell fasch deklariert ist. Poste doch auch bitte mal die Deklaration der DLL Definition.

Habe hier noch ein sehr gutes Dokument zu diesem Thema gefudnen, das du dir unbeding durchlensen solltest.
http://rvelthuis.de/articles/articles-dlls.html

TurboMagic 22. Apr 2021 14:15

AW: Pointer Problem
 
Asche auf mein Haupt!

@Data[0] geht doch!
Der weitere Code in der DLL hatte noch diverse andere Fehlerchen!

Was aber krachte war: Pointer(Data[0], da fehlte wohl der Addressoperator drin.
Was aber auch funktionierte war GetMem auf einen normalen Pointer und den übergeben.
Nur ist @Data[0] schöner und erspart das Umkopieren der Daten in den normalen Pointer.
Ja, man hätte dem auch einfach auf @Data[0] zuweisen können.
ABer @Data[0] ist halt am leserlichsten für meine Zwecke.

TomyN 22. Apr 2021 15:25

AW: Pointer Problem
 
Wenn die DLL von verschiedenen Sprachen (in 32Bit Systemen) aufgerufen werden soll, dann solltest Du evtl. auch StdCall als Aufrufconvention definieren.

TurboMagic 22. Apr 2021 16:16

AW: Pointer Problem
 
Hallo,

nein. Die Forderung hier war cdecl statt StdCall
wegen Plattformunabhängigkeit. Das war ja aber nicht das Problem,
sondern Copy & Paste Programmierung und dann nicht alles richtig
angepasst an die neuen Randbedingungen.

Grüße
TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 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