组合中的AccessViolationException:尝试读取或写入受保护的内存

时间:2008-11-04 16:42:12

标签: winforms combobox access-violation

在使用我们的应用程序(VB.Net,Winforms,使用框架的v2)时,用户偶尔会遇到上述错误。我无法重现它。 callstack如下:

:System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。    在System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc,IntPtr hWnd,Int32 msg,IntPtr wParam,IntPtr lParam)    在System.Windows.Forms.NativeWindow.DefWndProc(消息& m)    在System.Windows.Forms.Control.DefWndProc(消息& m)    在System.Windows.Forms.Control.WndProc(消息& m)    在System.Windows.Forms.ComboBox.WndProc(消息& m)    在ControlEx.AutoCompleteCombo.WndProc(消息& m)    在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)    在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)    在System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)

ControlEx.AutoCompleteCombo.WndProc的代码如下:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Try
        If Not m_fReadOnly Then
            MyBase.WndProc(m)
        Else
            Select Case m.Msg
                Case WM_LBUTTONDOWN, WM_LBUTTONDBLCLK
                    ' do nothing
                Case Else
                    MyBase.WndProc(m)
            End Select
        End If
    Catch ex As OutOfMemoryException
        Throw New OutOfMemoryException("Exception during WndProc for combo " & Me.Name, ex)
    End Try
End Sub

添加了错误处理,以便在得到OutOfMemoryException时确定哪个组合导致问题。

任何有关导致此问题的线索都将受到高度赞赏! : - )

5 个答案:

答案 0 :(得分:1)

我的代码中的OutOfMemoryException有一种奇怪的非确定性感觉。

你为什么需要那个?如果你需要它,这可能是你的问题的原因吗? OutOfMemoryExceptions非常罕见。如果你有这些,我认为这是一个强烈的迹象,其他错误。

答案 1 :(得分:0)

看起来您正在使用名为AutoCompleteCombo的自定义组合框控件。我怀疑该类中的WndProc覆盖有一个错误 - 可能会改变消息参数的值。你可以发布该方法的代码,以便我们看看吗?


您发布的代码中没有任何内容会导致问题。您应该查看AutoCompleteCombo的其余代码以查找潜在的错误。没有其他任何事情可以继续下去。

答案 2 :(得分:0)

感谢您的投入,GvS和Stu。我正在对OutOfMemory进行更多的探测,发现这可能会发生一种有趣的方式(在组合中添加两个项目,在其ToString覆盖中返回Nothing - http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=247053&SiteID=1

答案 3 :(得分:0)

我刚刚发现原始异常(AccessViolationException)也是由ComboBox中的一个项引起的,其ToString返回Nothing(null)。我不知道为什么你有时会得到OutOfMemory,有时候是Accessviolation,有时是NullReference例外。

答案 4 :(得分:0)

在黑暗中拍摄,但是您可能在KeyDown,KeyUp或KeyPress事件期间尝试修改自动完成列表?

根据微软的说法,这可以cause access violations