Zitat von
heiopei:
genauso wie New(result))
Du hast doch bestimmt keinem anderen MemoryManager (z.B. ShareMM, FastMM, oder ähnliches) eingebunden?
Der DelphiMM (wird standardmäßig installiert) wird für jedes Delphi-Modul einzeln erzeugt und diese verschiedenen MMs arbeiten nicht zusammen, daher kannst du keinen Speicherbereich in einem Modul (
DLL/EXE) erstellen (egal ob mit New, SetLength, oder wie auch immer) und in dem anderen Modul freigeben, oder seine Größe ändern,
denn wenn du es versuchst, dann wird der entsprechende MemoryManager meckern (mit 'ner
Exception reagieren), da er keine Referenz zu dem angegebenen Speicherbereich(Pointer) in seinen Verwaltungsdaten finden kann.
Zitat:
wenn ich versuche, das array zu übernehmen
wie gesagt ... lesen und schreiben kann man zwar in diesen Speicherbereich, da der ja zur Instance(Anwendung) gehört und somit alle Module dieser Instance zugriff haben, der Speicher kann außerhalb einenes Moduls nicht verwaltet werden.
also entweder du nimmst ein Array mit fester größe und übergibst es per Var-Parameter ... denn da wird der Speicher in deiner EXE reserviert und die
DLL schreibt nur darain
Delphi-Quellcode:
type TSpezielle = record
Name: PChar;
Index: Word;
end;
TSpezielleArray = array[0..irgendwas] of TSpezielle;
TKartenSammlungInfo = record
Name: PChar; //Name der Kartensammlung
Version: PChar; //Version der Kartensammlung
Karten: Byte; //Anzahl der Karten (ohne spezielle)
Spezielle: TSpezielleArray; //vorhandene spezielle Karten mit Name und
//Index
end;
procedure DLLSammlungInfo(var Info: TKartenSammlungInfo); stdcall;
oder bei 'nem dynamischen array rufst du SetLength in der EXE auf und arbeitest auch per Var-Parameter
Delphi-Quellcode:
type TSpezielle = record
Name: PChar;
Index: Word;
end;
TSpezielleArray = array of TSpezielle;
TKartenSammlungInfo = record
Name: PChar; //Name der Kartensammlung
Version: PChar; //Version der Kartensammlung
Karten: Byte; //Anzahl der Karten (ohne spezielle)
Spezielle: TSpezielleArray; //vorhandene spezielle Karten mit Name und
//Index
end;
function DLLSammlungInfoSize: integer; stdcall;
procedure DLLSammlungInfo(var Info: TKartenSammlungInfo); stdcall;
// in der EXE dann
SetLength(Info.Spezielle, DLLSammlungInfoSize);
DLLSammlungInfo(Info);
und wenn es keine Probleme mit der
RTTI geben sollte, dann kannst du es auch so lassen, wie bisher und bindest aber einen SharedMM ein, damit in der EXE und der
DLL der die MemoryManager zusammen arbeiten und somit auch den Speicher des anderen MMs mit verwalten können.