我有一个处理TPanel
的自定义WMNCHitTest
。在运行时,当鼠标进入面板时,我得到以下AV:
项目ClientDatasetEditor.exe引发异常类$ C0000005,并显示消息'访问冲突位于0x00405219:读取地址0x0000000c'
调用堆栈显示:
> :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的原因的任何想法吗?
答案 0 :(得分:0)
知道造成AV的原因是什么?
GetMem
中的访问冲突是由堆损坏引起的。您的程序中存在损坏堆的缺陷。
跟踪故障的最佳方法是在完全调试模式下使用FastMM内存管理器。希望这可以告诉您代码中破坏堆的重点。