AGB  ·  Datenschutz  ·  Impressum  







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

Dyn Array of Record aus DLL

Ein Thema von gmc616 · begonnen am 22. Nov 2006 · letzter Beitrag vom 24. Nov 2006
 
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#1

Dyn Array of Record aus DLL

  Alt 22. Nov 2006, 16:33
Hallo DPler,

ich möchte ein Record in einer DLL füllen. Dazu habe ich in einer separaten Unit, die sowohl vom Hauptprogramm als auch der DLL verwendet wird, das Record definiert. z.B. so:
Delphi-Quellcode:
unit MyRecords;
...
type TSimpleRecord = record
  Zeile1 : String;
  Zeile2 : String;
end;

type TPSimpleRecord = ^TSimpleRecord;

var
  MyRecord : TSimpleRecord;
  MyPointer : TPSimpleRecord;
Das ich ohne Speichermanager arbeiten will, reicht es der Dll-Funktion einen Zeiger auf das Record zugeben.
Das Hauptprogramm:
Delphi-Quellcode:
unit AppMain;
...
procedure FillRecord (APointer:TPSimpleRecord); stdcall; external 'MyDll.dll';
...
MyPointer := @MyRecord;
FillRecord (MyPointer);
ShowMessage (MyRecord.Zeile1);
Die DLL:
Delphi-Quellcode:
library MyDll;
...
procedure FillRecord (APointer : TPSimpleRecord); stdcall;
begin
  APointer^.Zeile1 := 'erste Zeile';
  APointer^.Zeile2 := 'zweite Zeile';
end;
Ich hoffe der Code ist soweit korrekt. Funktionieren tut er jedefalls.

Nun habe ich aber das Problem, das mein Record weitere Array of Record enthalten muß. z.B. so:
Delphi-Quellcode:
unit MyRecords;
...
type TSimpleRecord = record
  Zeile1 : String;
  Zeile2 : String;
end;

type TDynRecord = record
  Name : string;
  Zeilen : array of TSimpleRecord;
end;

type TPDynRecord = ^TDynRecord;

var
  MyDynRecord : TDynRecord;
  MyDynPointer : TPDynRecord;
Füllen des Record wollte ich ähnlich machen w.o.:
Delphi-Quellcode:
Unit AppMain;
...
procedure FillDynRecord (APointer:TPDynRecord); stdcall; external 'MyDll.dll';
...
MyDynPointer := @MyDynRecord;
FillRecord (MyDynPointer);
Die Funktion in der DLL sieht dann z.B. so aus:
Delphi-Quellcode:
library MyDll;
...
procedure FillDynRecord (APointer : TPDynRecord); stdcall;
begin
  APointer^.Name := 'Test';
  Setlength(APointer^.Zeilen,2);
  APointer^.Zeilen[0].Zeile1 := 'erste Zeile';
  APointer^.Zeilen[0].Zeile2 := 'zweite Zeile';
  APointer^.Zeilen[1].Zeile1 := 'dritte Zeile';
  APointer^.Zeilen[1].Zeile2 := 'vierte Zeile';
end;
Das Füllen des DynRecords in der DLL funktioniert.

Wenn allerdings die Anwendung wieder zurück ins HauptProgramm springt, ist dort mein DynRecord "nicht verfügbar" und bei Rücksprung aus der Function, die FillDynRecord gerufen hat, stürzt die Anwendung mit einer Schutzverletzung beim Speicherzugriff an Adresse xy ab.

Ich vermute, das beim Vergrößern des Array of Record mit setlength() irgendwas im Speicher überschrieben wird.

Was muss ich tun, damit das Dynamische Array of Record korrekt zurück gegeben wird?

Danke vorab schon mal für eure Hilfe.
gmc
  Mit Zitat antworten Zitat
 


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 09:18 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