AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String-Verlängerung => Delphi-Bug?

Ein Thema von sgmeiner · begonnen am 5. Jul 2006 · letzter Beitrag vom 6. Jul 2006
Antwort Antwort
sgmeiner

Registriert seit: 22. Feb 2006
10 Beiträge
 
#1

String-Verlängerung => Delphi-Bug?

  Alt 5. Jul 2006, 14:27
Hallo zusammen.

Ich bin auf ein Verhalten gestoßen, das ich mir nicht mehr erklären kann und würde gern mal eure Meinungen dazu hören:

Ich habe einige DB-Operationen (ZEOS) in einer DLL gekapselt. Beim ersten Aufruf einer bestimmten Funktion geht alles glatt. Das Problem (die Access Violation) tritt auf, wenn ich die Methode das zweite mal aufrufe. Durch Debuggen der ZEOS-Komponenten bin ich auf die Zeile gestoßen die den Fehler verursacht - was mir aber auch nicht wirklich hilft:
Result.Value := Result.Value + ReadChar; Result ist ein Record, Value ist vom Typ String, ReadChar vom Typ Char. Ich verstehe nicht, dass da eine AV fliegt. Nachdem ich ein wenig im Auswerten-Dialog vom BDS rumgespielt hab, hab ich gemerkt, dass ich den Wert von Result.Value erst mal gar nicht ändern kann. Ich habs versucht, neuen Wert eingegeben, aber die Variable hat scheinbar nur einen leeren String mitgekriegt. Erst beim zweiten Ändern kam der Wert in der Variablen an. Unter diesen Umständen läuft das Programm allerdings anschließend fehlerfrei durch

Meine Vermutung geht in die Richtung, dass der Compiler (BDS2006 + Update 2) hier Probleme hat Speicher für den String zu allokieren... Was meint ihr dazu? Bin momentan absolut ratlos

Danke schon mal für eure Antworten
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer
Online

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: String-Verlängerung => Delphi-Bug?

  Alt 5. Jul 2006, 14:32
Strings und DLL? Übergiebst Du diesen Record von der DLL in die Exe bzw. umgekehrt?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
fwsp
(Gast)

n/a Beiträge
 
#3

Re: String-Verlängerung => Delphi-Bug?

  Alt 5. Jul 2006, 14:33
Hast du in der dll die delphi compiler direktive eingebunden?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: String-Verlängerung => Delphi-Bug?

  Alt 5. Jul 2006, 14:34
Versuchs mal den Wert in einer Zwischenvariavle zwischenzuspeichern und den endgültigen wert dann result zuzuweisen.
Markus Kinzler
  Mit Zitat antworten Zitat
sgmeiner

Registriert seit: 22. Feb 2006
10 Beiträge
 
#5

Re: String-Verlängerung => Delphi-Bug?

  Alt 5. Jul 2006, 14:38
@Bernhard Geyer: Nein, String und Record bleiben innerhalb der DLL. Die DB-Komponenten brauchen die nur zum internen Datenhandling. Die Daten werden im Fall der betroffenen Funktion nur in ein Textfile geschrieben. Aber soweit komm ich beim zweiten Aufruf meiner Funktion gar nicht mehr. Da scheppert's schon vorher.

@fwsp: Welche Direktive meinst du genau?

@mkinzler: Hab ich auch schon probiert... gleiches Ergebnis. Ich step das aber morgen nochmal gründlich durch
  Mit Zitat antworten Zitat
sgmeiner

Registriert seit: 22. Feb 2006
10 Beiträge
 
#6

Re: String-Verlängerung => Delphi-Bug?

  Alt 6. Jul 2006, 08:26
Erstmal danke für die Anregungen. Bin leider noch nicht viel weiter gekommen.

Hab das jetzt nochmal mit einer temporären Variable ausprobiert, wie mkinzler das vorgeschlagen hat. Das Ergebnis ist genau das gleiche. Vielleicht sollte ich nochmal erklären, was die Prozedur macht, in der die AV (write of address 0x00000001) auftritt:

Es handelt sich dabei um eine Tokenizer-Funktion, die das nächste Token für Strings in Anführungszeichen aller Art liefert. Dabei wird immer ein Zeichen aus einem Stream gelesen (ReadChar, siehe Code) und überprüft, ob es mit dem ersten gelesenen übereinstimmt, was ja dann bedeuten würde, dass das Token fertig gelesen ist.

Gut ich hab meine Abfrage mal so umgebaut, dass betreffende Token nicht vorkommt. Achtung, jetzt kommts: bleibe ich unter einer bestimmten "kritischen" Grenze was die Stringlänge betrifft läuft diese Funktion durch, die AV kommt an einer anderen Stelle (andere Funktion, andere String-Variable, beim Aufruf von AnsiUpperCase(CurrentValue), auch wieder Access Violation mit write of address 0x00000001). Es scheint hier wirklich um die Menge der im Speicher für den String reservierten Zeichen zu gehen...

Stichwort Heap-Overflow vielleicht???

Nachtrag: Hab FastMM4 ausprobiert - Absturz bei FastFreeMem während versucht wird das (oder den / die???) Lock aufzuheben. ebx soll wohl eine Referenz auf TSmallBlockType enthalten, enthält aber den Wert 1.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:56 Uhr.
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