【发布时间】:2011-09-27 09:30:02
【问题描述】:
我有一个使用静态链接运行时包以及使用它们的设计时包的应用程序。出于某种原因,任何单元完成部分中的代码都没有在运行时运行(我不知道这是什么时候开始发生的)。
finalization
ShowMessage('Goodbye');
end.
关闭 Delphi 会显示该消息,但不会在我的应用程序关闭时显示。更奇怪的是,如果我在 ShowMessage 上放置一个断点,它会在那里中断但不执行该行。如果finalization中有多行,则调试器在第一行停止,不执行,然后跳转到最后。
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
有谁知道造成这种情况的原因和/或解决方法?在您注意到外部资源没有被清理之前,您通常可能不会注意到您的最终确定没有运行。
【问题讨论】:
-
您确定
ProcOne和ProcTwo不会抛出任何异常吗? -
是的,任何东西都不会执行。例如。 MyInt := 5;如果断点落地时是3,跨过之后还是3。
-
另外,在文本编辑器中手动检查您的 .dpk 文件,然后查找:
{$WeakPackageUnit ON} -
在您的应用程序执行期间,您是否动态加载其他包?这些包是否也引用了相同的问题包/单元?
-
@Allen Bauer:是的,引用包含问题单元的包的其他包在运行时动态加载。但并非所有动态加载的包都会导致问题,即使所有加载的包都引用了静态包。问题不仅在于一个单元,而且任何单元的最终确定中的代码都不会被执行。
标签: delphi package delphi-2007 finalization