delphi中的访问冲突

时间:2011-11-30 09:38:11

标签: delphi delphi-2009

在delphi应用程序中,当我将鼠标移动到具有提示的组件时,我看到此错误: “模块'Plibrary.exe'中地址00484F3B的访问冲突。读取地址0000026C” 为什么会这样?

调用堆栈:

:758e9617 KERNELBASE.RaiseException + 0x54 
:458bf456 System.@UStrCmp 
:00407558 @UStrCmp + $2C 
Forms.TApplication.SetHint(???) 
Forms.TApplication.Idle(???) 
Forms.TApplication.HandleMessage 
Forms.TApplication.Run Plibrary.Plibrary 
:75ca1194 kernel32.BaseThreadInitThunk + 0x12 
:7752b3f5 ntdll.RtlInitializeExceptionChain + 0x63 
:7752b3c8 ntdll.RtlInitializeExceptionChain + 0x36" 

失败的代码在第17732行的System.pas文件中:“MOV ESI,[ESP]”

编辑(来自评论):

在此过程的remain.pas文件中:

procedure TMainForm.ShowHint(Sender: TObject); 
begin 
  if Length(Application.Hint) > 0 then begin 
    StatusBar.SimplePanel := True; 
    StatusBar.SimpleText := Application.Hint; //this line gives error 
  end else    
    StatusBar.SimplePanel := False; 
end;

2 个答案:

答案 0 :(得分:6)

  

读取地址0000026C

这个非常低的地址表示nil对象引用的成员字段的偏移量。在调试器下运行并确保将调试器设置为在异常时中断。如果是这样,您应该能够确定哪个对象引用为nil

很可能AV在VCL代码中发生,尽管几乎可以肯定是由于代码中的错误。如果调试器没有在非常有用的位置中断,请在项目选项中启用Debug DCU,以便在引发异常时查看VCL源代码。

您提供的堆栈跟踪表明错误在TApplication.SetHint中,同时执行字符串比较。第TApplication.SetHint行的第一行是:

if FHint <> Value then

我打赌FHint TApplication的偏移量为$026C,并且不知何故,您的Application变量设置为nil。也就是说,我不明白为什么错误不会在Length(Application.Hint)之前提出。远程调试这个很难!

看了TApplication的布局后,我想我们可以排除Application nil。也许FHint本身已经被破坏,甚至可能Value。我认为它可以访问实际的代码和调试环境来跟踪它。

答案 1 :(得分:1)

基于stacktrace中提供的信息:

<强> TApplication.Idle:

Control := DoMouseIdle;
if FShowHint and (FMouseControl = nil) then
  CancelHint;
Application.Hint := GetLongHint(GetHint(Control)); // SetHint is called next:

<强> TApplication.SetHint:

if FHint <> Value then // This is the UStrCmp which fails with a Int overflow

String + IntOverflow - &gt;非终止字符串。所以最可能的原因是没有终止符的字符串。

那么字符串来自哪里......

  • GetHint(Control)搜索控件(位于您使用光标单击的位置)及其父级,以查找非空的提示。

  • GetLongHint在字符串中搜索|如果找到,则使用|后面的部分否则它使用完整的字符串。

  • UStrCmp是一段很长的汇编代码,它调用其他汇编代码。其中一些可能会引发EIntegerOverflow错误。

<强>劝

使用调试器(启用debug dcu)查看哪个字符串没有终结符(末尾为0个字符)。如果你找到它,试着解决它或者扩展问题,如果你想要我们更多的帮助。