我们有一个在 Delphi 2006 中运行良好的大型应用程序。我们已将其移至 XE5,并且经常遇到零星的访问冲突。我们正在使用 VCL 表单和许多 DevExpress 和其他第三方组件。我们正在使用带有 Delphi XE Enterprise 版本 19.0.14356.6604 的 Windows 7 Professional。
在移植到 XE5 之后,我们在网上、这里和其他地方查看了有关 A/V 的帖子,但没有发现任何似乎与我们的问题相关的内容。
以下是我们对 A/V 的了解:
{$IFDEF CPUX86}asm 部分procedure Move(const Source; var Dest; Count: NativeInt);中。线路是FILD QWORD PTR [EAX] {Last 8}。我们猜测这个问题与我们的应用程序如何处理 Windows 7 内存管理有关,但我们不知道如何找出哪里出错了。附加了一个示例调用堆栈。
任何人都可以建议我们如何继续解决此问题?是否有第三方调试工具可以提供帮助?我们是否可以使用 Delphi IDE …
我在Delphi中使用多年的技术已不再适用,因为我创建的表单在发布后不会设置为nil.这是一些示例代码:
type
TAboutForm = class(TForm);
end;
function ShowAboutForm: TModalResult;
function ShowAboutForm2: TModalResult;
implementation
var
FAboutForm: TAboutForm;
{$R *.dfm}
function AboutForm: TAboutForm;
begin
if not Assigned(FAboutForm) then
FAboutForm := TAboutForm.Create(Application);
Result := FAboutForm;
end;
function ShowAboutForm: TModalResult;
begin
with AboutForm do
try
Result := ShowModal;
finally
Release;
end;
end;
function ShowAboutForm2: TModalResult;
var
AAboutForm: TAboutForm;
begin
AAboutForm := AboutForm;
try
Result := AAboutForm.ShowModal;
finally
AAboutForm.Release;
AABoutForm := nil;
end;
end;
Run Code Online (Sandbox Code Playgroud)
ShowAboutForm和ShowAboutForm2都没有第二次工作.两者都抛出访问冲突,因为任何一种方法都没有将FAboutForm设置为nil - 即使ShowAboutForm2显式地将局部变量设置为nil - 因此它不会在AboutForm中重新创建.我发现让代码工作的唯一方法是:
function ShowAboutForm3: TModalResult;
begin
fAboutForm := …Run Code Online (Sandbox Code Playgroud)