AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer Problem

Ein Thema von TurboMagic · begonnen am 22. Apr 2021 · letzter Beitrag vom 22. Apr 2021
Antwort Antwort
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#1

Pointer Problem

  Alt 22. Apr 2021, 11:07
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?
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.174 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Pointer Problem

  Alt 22. Apr 2021, 11:23
Schau mal da:
http://docwiki.embarcadero.com/RADSt...g_von_Speicher
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#3

AW: Pointer Problem

  Alt 22. Apr 2021, 13:13
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
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Pointer Problem

  Alt 22. Apr 2021, 13:24
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;
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#5

AW: Pointer Problem

  Alt 22. Apr 2021, 13:29
Das funktioniert so leider nicht.
Ich baue es jetzt auf Speicher reservieren um.
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Pointer Problem

  Alt 22. Apr 2021, 14:13
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

Geändert von Rolf Frei (22. Apr 2021 um 14:16 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#7

AW: Pointer Problem

  Alt 22. Apr 2021, 14:15
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.
  Mit Zitat antworten Zitat
TomyN

Registriert seit: 8. Nov 2006
Ort: Bayreuth
148 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Pointer Problem

  Alt 22. Apr 2021, 15:25
Wenn die DLL von verschiedenen Sprachen (in 32Bit Systemen) aufgerufen werden soll, dann solltest Du evtl. auch StdCall als Aufrufconvention definieren.
Thomas Neumann
Meine Projekte
www.satlive.audio
www.levelcheck.de
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#9

AW: Pointer Problem

  Alt 22. Apr 2021, 16:16
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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