我有一个使用静态链接运行时包以及使用它们的设计时包的应用程序。出于某种原因,任何单元完成部分中的代码都没有在运行时运行(我不知道这是什么时候开始发生的)。
finalization
ShowMessage('Goodbye');
end.
关闭 Delphi 会显示该消息,但不会在我的应用程序关闭时显示。更奇怪的是,如果我在 ShowMessage 上放置一个断点,它会在那里中断但不执行该行。如果终结中有多行,则调试器在第一行停止,不执行它然后跳转到最后。
procedure ProcOne;
begin
SomeObject.Free; // Debugger does not enter or stop here
SomeObject := nil;
end;
finalization
ProcOne; // Debugger stops here, doesn't execute, jumps to "end."
ProcTwo; // Every line has a blue dot
ShowMessage('Bye');
end.
ProcOne 断点上的调用堆栈显示 @Halt0 => FinalizeUnits => MyPackage.MyUnit.Finalization。
如果我在不使用包的应用程序中包含该单元,则一切都会正确执行。
有谁知道可能导致这种情况的原因是什么?
编辑:
感谢 Allen Bauer 指出正确方向的评论,我已经设法隔离了这个问题。如果应用程序是使用运行时包构建的,然后动态加载另一个也引用该包和单元的包,似乎就会出现问题。
我创建了一个演示问题的测试项目:TestFinalization
有谁知道这个和/或解决方法的原因?您通常可能不会注意到您的最终确定没有运行,直到您注意到外部资源没有被清理。