Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010 (https://www.delphipraxis.net/144580-strings-record-strukturen-delphi7-vs-bds-2009-2010-a.html)

Neutral General 11. Dez 2009 12:38

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
 
Zeig mal Code an denen die Probleme auftauchen.

Und speicherst du diese Records in eine Datei und liest sie wieder aus? Dann wette ich, dass deine Speicher- und Ladefunktionen falsch sind (zeig die mal bitte)

p80286 11. Dez 2009 12:54

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
 
Dumme Frage am Rande:
Bei den Shortstrings ist S[0] die Länge, S[1] der erste Buchstabe usw.

Bei den AnsiStrings, wo ist da die Länge?
Nach meinem Verständnis verbirgt sich hinter S dann ungefähr so etwas:
Delphi-Quellcode:
record
  S_Adr : pointer;
  S_Lang: integer;
end;
Gruß
K-H

kaju74 11. Dez 2009 12:56

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
 
Stimmt: +1 Byte für die Längenangabe.

Codestelle ist schwierig...da das ein Konstrukt aus Host läd PlugIn, Plugin sammelt Daten, PlugIn ruft Callback auf, Host nimmt Daten entgegen und reicht diese an eine interne Methode weiter, und hier gibt's das Problem. Überliefert wird ein Zeiger auf eine Rekordsstruktur, die ich wunderbar vom Host aus typecasten und auslesen kann. Wenn ich aus dieser Struktur aber einen String an eine interne Methode übergebe, sehe ich beim debuggen, das dieser zwar noch an die Methode übergeben wird, dort aber nicht ankommt. Ich suche aber mal das Codestück raus....kommt gleich...

Gruß,
kaju

Neutral General 11. Dez 2009 12:56

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

Zitat von p80286
Dumme Frage am Rande:
Bei den Shortstrings ist S[0] die Länge, S[1] der erste Buchstabe usw.

Bei den AnsiStrings, wo ist da die Länge?

An der gleichen Stelle

Delphi-Quellcode:
ShortString = packed record
  Len: Byte;
  // In er Praxis so nicht schreibbar aber ihr wisst was ich meine :mrgreen:
  Data: Array[1..Len] of Char;
end;

LongStringData = packed record
  Len: Cardinal;
  Data: Array of Char;
end;

AnsiString = ^LongStringData;

// eigentlich ja eher sowas..

AnsiString = ^LongStringData.Data;

// Aber egal.. :D
Würde ich mal sagen. Wenn ich falsch liege, dann steinigt mich :mrgreen:

himitsu 11. Dez 2009 13:08

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
 
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 )

Neutral General 11. Dez 2009 13:15

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

Zitat von himitsu
[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

Das hatte ich ja oben noch korrigiert ;)

Und ansonsten... Ok ok :mrgreen:

p80286 11. Dez 2009 13:33

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
 
Danke für die Erläuterungen,

Auch wenn ich den "String"-records per se nicht traue, wenn ein Pointer übergeben wird dann sind das doch in der Zwischenzeit absolute Adressen und nicht mehr diese Segment-Krücken DS:xxxxx ES:yyyy, dann dürfte doch nichts mehr schief gehen? Gleiches Typverständnis voraus gesetzt.( und naturlich vorhandene Zugriffsrechte)

Gruß
K-H

Neutral General 11. Dez 2009 13:43

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
 
Diese "Segment-Krücken" gibt es in der Art nur noch im RealMode werden heute eigentlich nicht mehr verwendet. Unter Windows umfassen alle Segmente (bis auf fs) den kompletten Speicher und heben somit eine Segmentierung auf.

Wobei ich allerdings nicht weiß, was das jetzt hier mit zu tun hat? Verstehe deine Frage oder dein Problem nicht

p80286 11. Dez 2009 16:53

Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
 
Wenn die Adresse (Pointer) "absolut" ist, sollte es ja für jedes Programm (Prozess) möglich sein korrekt auf an dieser Adresse liegende Daten zuzugreifen.
Und die Ausgangsfrage legt ja nahe, das dies nicht der Fall ist.

Gruß
K-H

hoika 11. Dez 2009 21:13

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

Zitat:

Wenn die Adresse (Pointer) "absolut" ist
Absolute im Sinne des erzeugenden Prozesses.

Da jedes Programm (Prozesse) 2 GB Speicher (Win32) anfordern kann,
ist doch klar, dass das trotzdem virtuell erfolgt.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz