![]() |
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) |
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:
Gruß
record
S_Adr : pointer; S_Lang: integer; end; K-H |
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 |
Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
Zitat:
Delphi-Quellcode:
Würde ich mal sagen. Wenn ich falsch liege, dann steinigt mich :mrgreen:
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 |
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:
@S zeigt auf Len, bzw. den Recordanfang
ShortString = packed record
Len: Byte; Data: Array[1..Len] of AmsiChar; end;
Delphi-Quellcode:
@S zeigt auf den Pointer
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[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 ) |
Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
Zitat:
Und ansonsten... Ok ok :mrgreen: |
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 |
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 |
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 |
Re: Strings in Record-Strukturen: Delphi7 vs. BDS 2009/2010
Hallo,
Zitat:
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 11:49 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