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?