tener - Fallo del programa VB6: parte 2. Consejos para solucionar la infracción de acceso(0xC00000005)
manual de visual basic 6.0 pdf+ejercicios para practicar (1)
Mi solución actual, que funciona, es crear todos mis objetos capicom desde el principio, y nunca crear nuevas instancias de capicom.encrypteddata más allá del primero. Esto funciona, pero es poco probable que el problema subyacente haya sido solucionado.
Relacionado con esta pregunta ¿Algún consejo sobre cómo solucionar el problema a continuación?
Después de mucha experimentación con el programa, he descubierto varias cosas.
Se bloquea de forma relativamente constante (el 90% del tiempo aproximadamente) al ejecutar la línea de código,
Set Message = New CAPICOM.EncryptedData
. Tenga en cuenta que la línea de arriba es meramenteDim Message As CAPICOM.EncryptedData
.La función que realiza esa llamada no falla cuando se llama antes en la ejecución del programa. La búsqueda binaria de errores no funciona para encontrar el problema, ya que llamar a la función en algunos lugares misteriosamente, impide que ocurra el error. A veces, la reconstrucción del programa parece afectar si aparece el error. Sí, es un heisenbug. Se aplican los mismos problemas con la búsqueda binaria temporal de error. Pasar 5 horas comparando dos versiones del programa solo para descubrir que ambas versiones tienen el error, aunque solo una de ellas muestra actualmente los síntomas, no es muy productiva.
El bloqueo se debe a una infracción de acceso 0xC00000005
La ejecución de WinDbg (el depurador de Windows) muestra que solo hay una línea de código que lee esta ubicación de memoria,
LoadPicture(szTmpBMP)
. Se llama al final de una función aterradora que toma la imagen de un recurso y la pega en un archivo temporal. Estaba lo suficientemente asustado de esta función que, por el bien de la prueba, la reemplacé con una llamada aLoadPicture("testcra.bmp")
, y luego no llamé a la función de recursos de miedo para ese mapa de bits. Esto no ayudó. La eliminación de esta llamada a loadpicture por completo tampoco ayudó, aunque el depurador ya no podía encontrar ningún punto donde se estaba leyendo la memoria afectada, y la memoria afectada ya no estaba en la misma ubicación. Esta prueba se realizó en una máquina virtual, por lo que algunas lecturas de memoria no necesariamente serán visibles para el depurador.Todo funciona perfectamente en Vista (tanto mi máquina local como mi VM Vista). La violación de acceso solo ocurre en XP.
Estoy usando VB6 Version 8176, 6.0.8169