Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.053 Beiträge
 
Delphi 12 Athens
 
#5

Re: exportieren von Strukturen aus DLLs...

  Alt 3. Mai 2006, 13:07
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat