winforms combobox access-violation

winforms - AccessViolationException de un combo: Intentó leer o escribir en la memoria protegida



combobox access-violation (5)

Parece que está usando un control de cuadro combinado personalizado llamado AutoCompleteCombo. Sospecho que la anulación de WndProc en esa clase tiene un error, probablemente cambiando el valor del parámetro del mensaje. ¿Puedes publicar el código de ese método para que podamos echarle un vistazo?

No hay nada en el código que publique que pueda causar un problema. Probablemente deberías mirar el resto del código de AutoCompleteCombo para encontrar posibles errores. No hay nada más para seguir.

De vez en cuando, los usuarios obtienen el error anterior cuando usan nuestra aplicación (VB.Net, Winforms, usando v2 del framework). No puedo reproducirlo La pila de llamadas es la siguiente:

: System.AccessViolationException: Intentó leer o escribir en la memoria protegida. Esto a menudo es una indicación de que otra memoria está corrupta. en System.Windows.Forms.UnsafeNativeMethods.CallWindowProc (IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam) en System.Windows.Forms.NativeWindow.DefWndProc (Message & m) en System.Windows.Forms.Control.DefWndProc (Mensaje & m) en System.Windows.Forms.Control.WndProc (Message & m) en System.Windows.Forms.ComboBox.WndProc (Message & m) en ControlEx.AutoCompleteCombo.WndProc (Message & m) en System.Windows.Forms.Control .ControlNativeWindow.OnMessage (Message & m) en System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) en System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

El código para ControlEx.AutoCompleteCombo.WndProc es el siguiente:

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

Se agregó el manejo de errores para que podamos determinar qué combo causa el problema cuando obtenemos una OutOfMemoryException.

Cualquier pista sobre las causas de esto sería muy apreciada. :-)


Tengo una extraña sensación no determinista con OutOfMemoryException en tu código.

¿Por qué necesitas eso? Y si lo necesita, ¿puede ser esta la causa de sus problemas? OutOfMemoryExceptions es muy raro. Si los tiene, creo que es una indicación fuerte de que algo más está mal.



Acabo de encontrar que la excepción original (AccessViolationException) también es causada por tener un elemento en el ComboBox cuyo ToString devuelve Nothing (null). No sé por qué a veces obtienes OutOfMemory, a veces Accessviolation y algunas veces una excepción de NullReference.


Rodado en la oscuridad, pero ¿quizás estás tratando de modificar la lista de Autocompletar durante un evento KeyDown, KeyUp o KeyPress?

Eso puede causar violaciones de acceso según Microsoft.