Das heißt ein Bug in den letzten Delphi-Versionen. Ich habe es gerade in diesem kürzlich kostenlosen Delphi 10.1 Starter überprüft und es verhält sich wie beschrieben - aber da es keine RTL-Quellen bietet, kann ich den genauen Grund nicht überprüfen.
In Delphi XE2 verhält es sich wie erwartet: erstellt den task-modalen Dialog und wartet darauf, dass Sie reagieren, wie von Sertak beschrieben.
In Delphi 10.1 wird das Leck tatsächlich an das Konsolenfenster gemeldet, aber das Programm wird nicht angehalten, um auf die Aufmerksamkeit des Benutzers zu warten. Dies ist sowohl aus diesem Grund als auch für die mögliche Verwendung von Konsolenprogrammen beim Scripting eine schlechte Lösung (CMD- oder PS-Skripte würden diese Nachricht nicht "verstehen" und könnten sie mit der legitimen Ausgabe und der Ausführung weiterer Stufenprogramme verwechseln.
Ich denke, Sie müssen den Regressions-Fehlerbericht über Delphi 10.0 öffnen - aber ich denke nicht, dass sie es bis zur Version 10.2 beheben würden.
Ich habe auch Ihre Anwendung von Delphi-Gabelspeicher-Manager auf die ursprüngliche umgeschaltet, und dann wurde das fehlerhafte Verhalten zurückgesetzt: Das Programm zeigte das Meldungsfeld und wartete, bis ich es vor dem Beenden in die IDE entlassen.
Momentan empfehle ich Ihnen, den erwähnten originalen Speichermanager anstelle von Delphi Fork zu verwenden.
program Project1;
{$APPTYPE CONSOLE}
uses
FastMM4,
System.Classes,
System.SysUtils;
...
Der ursprüngliche Speicher-Manager befindet sich auf http://github.com/pleriche/FastMM4 Sie Git-Client in Ihrem Delphi oder ein eigenständiges selbst eine Beurteilung aktualisiert verwenden können, zu halten, oder Sie können den Code einmal herunterladen und stoppen Sie die Aktualisierung, auf.
Die entsprechenden Zitate seines Codes sind:
{$ifdef LogErrorsToFile}
{Set the message footer}
LMsgPtr := AppendStringToBuffer(LeakMessageFooter, LMsgPtr, Length(LeakMessageFooter));
{Append the message to the memory errors file}
AppendEventLog(@LLeakMessage[0], UIntPtr(LMsgPtr) - UIntPtr(@LLeakMessage[1]));
{$else}
{Set the message footer}
AppendStringToBuffer(LeakMessageFooter, LMsgPtr, Length(LeakMessageFooter));
{$endif}
{$ifdef UseOutputDebugString}
OutputDebugStringA(LLeakMessage);
{$endif}
{$ifndef NoMessageBoxes}
{Show the message}
AppendStringToModuleName(LeakMessageTitle, LMessageTitleBuffer);
ShowMessageBox(LLeakMessage, LMessageTitleBuffer);
{$endif}
end;
end;
{$endif}
end;
und
{Shows a message box if the program is not showing one already.}
procedure ShowMessageBox(AText, ACaption: PAnsiChar);
begin
if (not ShowingMessageBox) and (not SuppressMessageBoxes) then
begin
ShowingMessageBox := True;
MessageBoxA(0, AText, ACaption,
MB_OK or MB_ICONERROR or MB_TASKMODAL or MB_DEFAULT_DESKTOP_ONLY);
ShowingMessageBox := False;
end;
end;
Dieser Code hängt von auf Desktop-Windows ausgeführt wird, so vielleicht Embarcadero versucht, zu "reparieren" es zu machen überqueren -Plattform. Aber die Art, wie sie es getan haben, brach es auf Windows-Konsole ....
Denken Sie auch über das Hinzufügen anderer Formen der Protokollierung - in die Datei und/oder in die Windows-Debug-Strings. Sie würden nicht so auffällig sein wie das modale Fenster, aber würden Ihnen zumindest helfen, die Informationen zu speichern, wenn Sie wissen würden, wo Sie danach suchen müssen.
Führen Sie das Programm in einem zuvor geöffneten Befehlsfenster aus, nicht in der IDE. –
Du könntest *** meine 'AutoConsole'-Einheit ausprobieren, siehe hier: http://rvelthuis.blogspot.de/2016/07/new-vethuisautoconsole-unit.html. Fügen Sie es einfach zu Ihrem Konsolenprogramm hinzu. –
Fügen Sie einen Haltepunkt auf "system.end" hinzu. –