tag:blogger.com,1999:blog-5708154677404807103.post2366335315208272758..comments2023-10-31T11:27:33.646+03:00Comments on Delphi Notes: ЗадачкаНиколай Зверевhttp://www.blogger.com/profile/08965247674233981930noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-5708154677404807103.post-15032180831497946962016-07-15T18:06:25.759+03:002016-07-15T18:06:25.759+03:00Так ExitProcess как раз и дёргается Halt'ом и ...Так ExitProcess как раз и дёргается Halt'ом и приводит к эффекту в задачке.Николай Зверевhttps://www.blogger.com/profile/08965247674233981930noreply@blogger.comtag:blogger.com,1999:blog-5708154677404807103.post-88171322657067732072016-07-15T16:23:25.844+03:002016-07-15T16:23:25.844+03:00ExitProcess(X) в помощь, если не нужно ничего &quo...ExitProcess(X) в помощь, если не нужно ничего "убирать" за собой ;-)AlWerewolfhttps://www.blogger.com/profile/02606095273852470185noreply@blogger.comtag:blogger.com,1999:blog-5708154677404807103.post-18798406625026740642016-07-15T14:45:42.056+03:002016-07-15T14:45:42.056+03:00Примерно так, да.
Я на эту проблему наткнулся, ког...Примерно так, да.<br />Я на эту проблему наткнулся, когда делал Halt из OnCreate датамодуля (или формы - не важно, один эффект). Т.е. вот вроде бы нормальная ситуация - создаю датамодуль (ещё до создания каких-либо форм), он делает проверки, если что-то не устроило - Halt(X). Ан нет, так нельзя для VCL-приложения. Надо делать ExitCode := X и дальше Application.Terminate + Exit<br />Ну или Abort/своё_исключение с обработкой в dpr-файле.Николай Зверевhttps://www.blogger.com/profile/08965247674233981930noreply@blogger.comtag:blogger.com,1999:blog-5708154677404807103.post-50264803416590182772016-07-15T14:01:58.397+03:002016-07-15T14:01:58.397+03:00Согласен, деструктор не отработает, т.к. VMT класс...Согласен, деструктор не отработает, т.к. VMT класса будет уже не доступна, а компилятор заставляет туда лезть даже когда деструктор не переопределен =( Можно конечно пропатчить указатель на класс инстанса, но это уже другая история =)<br /><br />а так, с подсказкой ;-) очевидно следующее:<br />program ConsHalt;<br />{$APPTYPE CONSOLE}<br />{$I-}<br /><br />type<br /> TMyClass = class<br /> public<br /> class destructor CD;<br /> destructor Destroy; override;<br /> end;<br /><br />destructor TMyClass.Destroy;<br />begin<br /> WriteLn('instance destructor');<br /> ReadLn;<br /> inherited;<br />end;<br /><br />class destructor TMyClass.CD;<br />begin<br /> WriteLn('class destructor');<br />end;<br /><br />procedure ExitP();<br />var<br /> Obj: TMyClass;<br />begin<br /> Obj := TMyClass.Create;<br /> Obj.Free;<br />end;<br /><br />begin<br /> ExitProcessProc := ExitP;<br /> Halt;<br />end.<br /><br />выдает<br />class destructor<br />instance destructorAlWerewolfhttps://www.blogger.com/profile/02606095273852470185noreply@blogger.comtag:blogger.com,1999:blog-5708154677404807103.post-90231366948808899492016-07-05T09:05:43.320+03:002016-07-05T09:05:43.320+03:00Не совсем. UnloadPackage дёргает FinalizePackage и...Не совсем. UnloadPackage дёргает FinalizePackage и сразу выгружает библиотеку из памяти (FreeLibrary). После этого (если я правильно всё понимаю) деструктор некоего объекта уже выгруженной библиотеки дёрнуть просто не получится.<br />Т.е. да, finalization/class-destructor выполнится раньше деструктора, но деструктор вообще не отработает - будет утечка памяти.<br /><br />Я про другой случай, всё в рамках single-exe, и деструктор вызывается корректно. Подскажу: такое можно получить, когда необходимо сигнализировать об аварийном завершении приложения.Николай Зверевhttps://www.blogger.com/profile/08965247674233981930noreply@blogger.comtag:blogger.com,1999:blog-5708154677404807103.post-63392007715489116092016-06-30T00:07:12.742+03:002016-06-30T00:07:12.742+03:00Динамические пакеты? UnloadPackage?Динамические пакеты? UnloadPackage?AlWerewolfhttps://www.blogger.com/profile/02606095273852470185noreply@blogger.com