Einzelnen Beitrag anzeigen

Der schöne Günther

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

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

  Alt 11. Jun 2020, 06:55
Ich stehe etwas auf dem Schlauch. Folgender Code lief unter XE7, später 10.0 Seattle und, ich meine, testweise unter 10.2 Tokyo ohne Probleme:

Delphi-Quellcode:
uses System.SysUtils, System.DateUtils, WinApi.ImageHlp;

class function TLinkerTimeStamp.GetTimeUTC(const FileName: string): TDateTime;
var
    LI: TLoadedImage;
    asAnsi: AnsiString;
begin
    // Nach: http://stackoverflow.com/a/8438985/2298252
    asAnsi := AnsiString(FileName); //TEncoding.Default.GetBytes(FileName);

    Win32Check(MapAndLoad(PAnsiChar(asAnsi), nil, @LI, False, True));
    try
        Result := LI.FileHeader.FileHeader.TimeDateStamp / SecsPerDay + UnixDateDelta;
    finally
        UnMapAndLoad(@LI);
    end;
end;
Nun, mit 10.4, gibt es eine Access Violation beim Verlassen der Methode, wenn er die lokale Variable AnsiString finalisieren will. Das kann man auch provozieren indem man vor dem letzten end; noch hinzufügt: Finalize(asAnsi); . Die AV findet statt in System._LStrClr(..) durch ein (für mich mystisches) Kommando
Code:
LOCK DEC    [EDX-skew].StrRec.refCnt       { threadsafe dec refCount      }
.

Was geschieht hier, und warum geschieht es?

Geändert von Der schöne Günther (11. Jun 2020 um 07:28 Uhr)
  Mit Zitat antworten Zitat