AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney
Thema durchsuchen
Ansicht
Themen-Optionen

Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

Ein Thema von Der schöne Günther · begonnen am 11. Jun 2020 · letzter Beitrag vom 13. Jun 2020
Antwort Antwort
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#1

AW: Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

  Alt 11. Jun 2020, 13:40
dann dreht wohl der Compiler durch.
Das befürchte ich auch. Wie sieht die Funktion _LStrToPChar bei Sydney denn aus? Bei dem alten Delphi ist es im wesentlichen ein Cast:

Delphi-Quellcode:
function _LStrToPChar(const S: _AnsiStr): _PAnsiChr;
begin
  if Pointer(s) = nil then
    Result := @(PEmptyString(@EmptyStringA[1])^.Nul)
  else
    Result := Pointer(s);
end;
Bzw. wird bei PAnsiChar(asAnsi) immer noch _LStrToPChar aufgerufen?
  Mit Zitat antworten Zitat
hannsg

Registriert seit: 8. Sep 2014
Ort: 61169 Friedberg
12 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

  Alt 12. Jun 2020, 07:24
Hallo,

ohne mich durch die Details gearbeitet zu haben: Hr. Eißing hat im Webinar zu 10.4 erwähnt, dass sich die default-Einstellung von $ZEROBASEDSTRINGS in 10.4 geändert hat. Vielleicht hat es etwas damit zu tun?

Schöne Grüße,
Meik
Meik
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

  Alt 12. Jun 2020, 07:45
Ich glaube das betrifft nur die iOS und Android-Compiler, oder?

Es muss ja irgend etwas mit der Referenzzählung des Strings sein, denn durch Einführen einer zusätzlichen Variable funktioniert es ja wieder.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#4

AW: Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

  Alt 12. Jun 2020, 07:55
Es muss ja irgend etwas mit der Referenzzählung des Strings sein, denn durch Einführen einer zusätzlichen Variable funktioniert es ja wieder.
Deshalb ja meine Frage in #7.

Bei dem Aufruf MapAndLoad(PAnsiChar(asAnsi)... wird implizit _LStrToPChar aufgerufen. Wenn Du über die zusätzlichen Variable mit asPAnsiChar := Addr(asAnsi[1]); gehst, dann wird _LStrToPChar nicht benutzt.

Ich vermute, wenn Du statt

asPAnsiChar := Addr(asAnsi[1]); wieder

asPAnsiChar := PAnsiChar(asAnsi); benutzen würdest, kracht es wieder. Denn dann wird wieder _LStrToPChar aufgerufen. Das würde dann zeigen, dass es nicht an der zusätzlichen Variablen liegt, sondern am Aufruf von _LStrToPChar.

Geändert von samso (12. Jun 2020 um 09:19 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

  Alt 12. Jun 2020, 08:07
Ah danke, jetzt habe sogar ich das verstanden. Und ja, unter 10.4 Sydney sieht es nun anders aus:

Delphi-Quellcode:
function _LStrToPChar(const S: _AnsiStr): _PAnsiChr;
begin
  if Pointer(s) = nil then
    Result := @(PEmptyString(Pointer(EmptyStringA))^.Nul)
  else
    Result := Pointer(s);
end;
Vorher (laut dir):
Delphi-Quellcode:
function _LStrToPChar(const S: _AnsiStr): _PAnsiChr;
begin
  if Pointer(s) = nil then
    Result := @(PEmptyString(@EmptyStringA[1])^.Nul)
  else
    Result := Pointer(s);
end;
Aus @EmptyStringA[1] wurde Pointer(EmptyStringA) . Vielen Dank. Ich konnte nichts finden weshalb das geändert worden ist. Außerdem spielen leere Strings hier ja keine Rolle. Wahrscheinlich hat sich noch mehr geändert.

PS: Unter 64 Bit funktioniert alles weiterhin wie gehabt. Wahrscheinlich steckt irgendwo ein Fehler in diesem mystischen Assemblercode.

PPS: Ich habe mal einen neuen Eintrag angelegt unter
https://quality.embarcadero.com/browse/RSP-29567

Geändert von Der schöne Günther (12. Jun 2020 um 08:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
10.055 Beiträge
 
Delphi 12 Athens
 
#6

AW: Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

  Alt 12. Jun 2020, 09:11
Ich kann das leider nicht reproduzieren. Ich habe es einmal mit GetTimeUTC(Application.ExeName) versucht. Hättest du einmal ein komplettes Beispiel mit dem Aufruf? Das würde ich bei einer Bugmeldung dringend empfehlen: Genau schreiben wie es reproduzierbar ist, wenn irgendwie möglich. Ansonsten wird dein Jira-Eintrag vermutlich als nicht reproduzierbar geschlossen...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

  Alt 12. Jun 2020, 09:21
Ja, du hast Recht. Das Merkwürdige: var dateTime := GetTimeUTC( ParamStr(0) ) liefert bei mir auch keinen Fehler. Nehme ich aber stattdessen var timestamp := DateTimeToStr( GetTimeUTC( ParamStr(0) ) ); kommt es zur AV. Allerspätestens hier endet mein Verständnis. Jetzt müssen die Profis ran.

Ich habe dem Report eine komplette .DPR angehangen (Direktlink)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
440 Beiträge
 
#8

AW: Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

  Alt 12. Jun 2020, 09:26
Ah danke, jetzt habe sogar ich das verstanden. Und ja, unter 10.4 Sydney sieht es nun anders aus.

Aus @EmptyStringA[1] wurde Pointer(EmptyStringA) . Vielen Dank. Ich konnte nichts finden weshalb das geändert worden ist. Außerdem spielen leere Strings hier ja keine Rolle. Wahrscheinlich hat sich noch mehr geändert.
Danke! Diese Änderung ist ja eher kosmetischer Natur. @EmptyStringA[1] und Pointer(EmptyStringA) erzeugt - solange die Strings nicht Zerobased sind - ja exakt den gleichen Assemblercode. Damit ist diese Fehlermöglichkeit raus.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Code mit AnsiString lief unter 10.0 Seattle, crasht unter 10.4 Sydney

  Alt 13. Jun 2020, 06:24
Die Ursache war übrigens eine ganz andere: Die Definition von TLoadedImage ist in 10.4 falsch, was dann dazu führte dass in den Bereich vom AnsiString reingeschrieben wurde.

(https://quality.embarcadero.com/browse/RSP-29567)
  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 10:41 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