Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010

  Alt 11. Dez 2009, 14:08
Du versuchst also diese Records über EXE/DLL-Grenzen hinweg zu übertragen?

A) sollte man bei sowas nie String, Integer und immer mit packed Records arbeiten, da unterschiedliche Compiler/Optionen sonst den Record verändern und andere Typen verwenden würden.

B) Hast du auch einen SharedMemoryManager eingerichtet?
Strings werden im Delphi-SpeicherManager abgelegt und da hat standardmäßig jede EXE/DLL ihre eigene Instanz eines SpeicherManagers.


[add]
*den Neutral General steinige*

Delphi-Quellcode:
ShortString = packed record
  Len: Byte;
  Data: Array[1..Len] of AmsiChar;
end;
@S zeigt auf Len, bzw. den Recordanfang

Delphi-Quellcode:
type
  // Delphi 2007 und kleiner
  PStrRec = ^StrRec;
  StrRec = packed record
    refCnt: Longint; // Referenzzähler
    length: Longint; // Stringlänge
    data: array[1..x] of AnsiChar;
  end;

  // Delphi 2009+
  PStrRec = ^StrRec;
  StrRec = packed record
    codePage: Word;
    elemSize: Word;
    refCnt: Longint;
    length: Longint;
    data: array[1..x] of AnsiChar; // für AnsiString oder WideChar für UnicodeString
  end;
@S zeigt auf den Pointer
@S[1] und Pointer(S), bzw PChar(S) zeigen auf "data", bzw. das erste Zeichen und nicht auf den RecordAnfang

also String/AnsiString/UnicodeStrin entsprechen intern jeweil ihrer PStrRec-Variante
( WideString ist was Anderes und der Entspricht einem OLE-String, verwaltet von der OleAuth.dll )
$2B or not $2B
  Mit Zitat antworten Zitat