To jest błąd w najnowszych wersjach Delphi. Właśnie sprawdziłem to w najnowszym darmowym Delphi 10.1 Starter i zachowuje się zgodnie z opisem - ale ponieważ nie dostarcza źródeł RTL, nie mogę sprawdzić dokładnego powodu.
W Delphi XE2 zachowuje się zgodnie z oczekiwaniami: tworzy dialog modalny z zadaniami i czeka na reakcję, tak jak opisano to w Sertak.
W Delphi 10.1 wyciek jest rzeczywiście zgłaszany do okna konsoli, ale program nie jest zatrzymany, aby czekać na uwagę użytkownika. To jest złe rozwiązanie, zarówno z tego powodu, jak i dla możliwego wykorzystania programów konsolowych w skryptach (skrypty CMD lub PS nie "zrozumiałyby" tego komunikatu i mogłyby go zmylić z legalnym wyjściem i niepowodzeniem w wykonaniu dalszych programów etapów. Myślę, że musisz otworzyć raport błędu typu regresji w Delphi 10.0 - ale nie sądzę, że naprawiłby go do wydania 10.2.
Również zmieniłem twoją aplikację z rozwidlonego menedżera pamięci na oryginalny, a następnie błędne zachowanie zostało przywrócone: program wyświetlił okno komunikatu i czekał aż go zwolnię przed wyjściem do IDE.
Obecnie sugeruję używanie wspomnianego oryginalnego menedżera pamięci, a nie jego widelca Delphi.
program Project1;
{$APPTYPE CONSOLE}
uses
FastMM4,
System.Classes,
System.SysUtils;
...
Oryginalny menedżer pamięci rezyduje w http://github.com/pleriche/FastMM4 Można używać klienta Git w Delphi lub samodzielnym jeden utrzymać się na bieżąco, można też pobrać kod raz i zatrzymać aktualizację, zależy od ciebie.
Odpowiednie cytaty z jego kod to:
{$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;
i
{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;
Kod ten zależy prowadzony na pulpicie systemu Windows, więc może Embarcadero próbował „naprawić” to, aby przejechać -Platforma. Jednak sposób, w jaki to zrobili złamał go na konsoli Windows ....
Należy również rozważyć użycie innych form logowania - do pliku i/lub do ciągów Debug systemu Windows. Nie byłyby tak przyciągające uwagi jak okno modalne, ale przynajmniej pomogłyby w zapisaniu informacji, gdybyś wiedział, gdzie jej szukać.
Uruchom program w poprzednio otwartym oknie poleceń, a nie w IDE. –
Możesz spróbować *** mojej jednostki "AutoConsole", zobacz tutaj: http://rvelthuis.blogspot.de/2016/07/new-velthuisautoconsole-unit.html. Po prostu dodaj go do programu konsoli. –
Dodaj punkt przerwania na "system.end". –