【问题标题】:Access violation when mouse enters custom TPanel鼠标进入自定义 TPanel 时访问冲突
【发布时间】:2014-02-22 15:30:38
【问题描述】:

我有一个自定义的TPanel 来处理WMNCHitTest。在运行时,当鼠标进入面板时,我得到以下 AV:

Project ClientDatasetEditor.exe 引发异常类 $C0000005,并带有消息“0x00405219 处的访问冲突:读取地址 Ox0000000c”

调用堆栈显示:

> :00405219 SysGetMem + $30 • :0040b7c6 @DynArraySetLength + $A • :005394e7 TWinControl.MainWndproc + $2F • :004c945a StdWndProc + 16 美元 • :76ff7694 user32.CaIINextt-iookEx + 0x97 • :76ff8baa; C:\WIND0WSysWOW64iser32.dII • :76ff8468; C:\WINDOWSysW0W64iser32.dII • :76ff9c40 user32.DispatchMessageW + Ox1O

关注WMNCHitTest句柄:

procedure tExGraphicControl.WMNCHitTest(var Message: tWMNCHitTest);
begin
  inherited;

  if not (csDesigning in  ComponentState) or
         (msOver      in fMouseStates   )    then Exit;

  if  Message.Msg = WM_NCRButtonUp then begin
      fMouseStates := [msLeftUp];
      Exit                      ;
  end;

  if  Message.Msg = WM_NCMBUTTONUP then begin
      fMouseStates := [msLeftUp];
      Exit                      ;
  end;

  if IsMouseOverControl (Self) then begin
     fMouseStates := [msOver, msMove];
     if  Assigned (fOnMouseEvent) then
          fOnMouseEvent (Self, fMouseStates);
  end;
end;

知道是什么导致了 AV 吗?

【问题讨论】:

  • 你真的包含了调用栈的上半部分吗?
  • @Sertac。是的,一切都在那里。
  • 我注意到当我包含 inherited 子句时,AV 被提升了。但如果我把它取下来,OnClick 事件就会停止响应。
  • 有趣的是它看起来不完整。我认为,您必须在继承上放置一个断点并对其进行跟踪。

标签: delphi delphi-xe3


【解决方案1】:

知道是什么导致了 AV 吗?

GetMem 中的访问冲突是由堆损坏引起的。您的程序中存在损坏堆的缺陷。

跟踪故障的最佳方法是在完全调试模式下使用 FastMM 内存管理器。希望这应该告诉您代码中破坏堆的点。

【讨论】:

  • 感谢您的评论。如果是这样,我怎样才能检测到是什么破坏了堆?有什么建议吗?
  • 遵循我的回答第二段中的建议。
  • 这个地址看起来像是访问一个 nil 的东西,但也许你是对的。
  • @Sertac 它在 GetMem 中。鉴于我们认为 GetMem 是正确的,它还能是什么。除了堆损坏之外,还有什么原因导致 GetMem 到 AV?
  • @David - 没关系,但我怀疑调用堆栈。
猜你喜欢
  • 1970-01-01
  • 2012-07-05
  • 2011-12-04
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多