在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;
答案 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个字符)。如果你找到它,试着解决它或者扩展问题,如果你想要我们更多的帮助。