![]() |
Pointer Problem
Hallo,
ich schreibe eine DLL und ein Testprogramm. Die DLL hat eine procedure die einen Pointer bekommt:
Delphi-Quellcode:
Ich rufe die aus einem OnClick Handler testweise auf:
procedure DoIt(Num: Byte; Ptr: Pointer);
begin // tuwas end;
Delphi-Quellcode:
Wenn ich mit dem Debugger jetzt schaue was da passiert,
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; 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? |
AW: Pointer Problem
|
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 |
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; |
AW: Pointer Problem
Das funktioniert so leider nicht.
Ich baue es jetzt auf Speicher reservieren um. |
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. ![]() |
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. |
AW: Pointer Problem
Wenn die DLL von verschiedenen Sprachen (in 32Bit Systemen) aufgerufen werden soll, dann solltest Du evtl. auch StdCall als Aufrufconvention definieren.
|
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 01:33 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