¿Qué significa descripción? ¿Cómo solucionar este problema?
Soluciones de errores de conflicto de acceso (acceso ilegal) (desde Internet) 2009-02-03 16:33 conflicto de acceso (acceso ilegal), error de protección general (error de protección general) o error de página no válida (Invalid Page Fallo), aunque estos términos son diferentes, son esencialmente el mismo error. Las violaciones de acceso generalmente se encuentran cuando un usuario de computadora ejecuta un programa que intenta acceder a un área de memoria que no puede designarse para su uso. Dirección
Los usuarios de Windows pueden ver a menudo mensajes de error similares.
Infracción de acceso en la dirección
Componente
: "Error: Infracción de acceso en la dirección 836556F8 (004096da) al leer la dirección 836556F8 (00401000)". , tienes más posibilidades de encontrar este error (_) que otros usuarios.
Una vez que Windows quiere escribir datos fuera del área de almacenamiento que se le ha asignado, sobrescribe otros programas o comandos o datos del sistema operativo. Una vez que esto suceda, el sistema operativo fallará o se apagará de alguna manera y tendrás que reiniciar tu computadora. Por ejemplo, cuando el siguiente programa para Windows NT/2000 encontró este error, apareció el Dr. Watson, detuvo el programa, capturó algunos detalles rápidos del país y luego los registró en forma de texto. Los errores de infracción de acceso son uno de los problemas más problemáticos que encuentran algunos programas de Windows. El propósito de este artículo es permitirle encontrar una manera de resolver conflictos de acceso en Delphi. En primer lugar, se afirma que la infracción de acceso no tiene nada que ver con Microsoft Access.
Al desarrollar con Delphi, encontrará dos tipos de conflictos de acceso: tiempo de ejecución y tiempo de diseño.
Primero, el diseño del conflicto de acceso
1. Motivos de hardware
Iniciar la fase de diseño o cerrar un IDE de Delphi y un compilador que sea propenso a infracciones de acceso. Los mensajes de infracción de acceso pueden deberse a diversos motivos, incluido el BIOS del sistema, el sistema operativo o los controladores de hardware que se ejecutan en la computadora. Algunas tarjetas de sonido, tarjetas gráficas y tarjetas de red pueden causar este error. ¿Por qué dices eso? En una computadora, cada tarjeta tiene su propio controlador de dispositivo. Para diferentes fabricantes, diferentes versiones de Windows o Delphi pueden encontrar diferentes problemas. Los siguientes pasos pueden ayudarle a resolver estos problemas:
1. Siga los pasos necesarios para demostrar que no existen conflictos entre los controladores que instaló.
2. A veces, reducir la resolución de la pantalla puede hacer que algunos controladores de gráficos extraños sean más estables.
3. Si tiene una placa base con dos procesadores, asegúrese de seguir los mismos pasos para cada procesador.
4. Todas las inquietudes relacionadas con el uso de los controladores más recientes para el hardware de su computadora.
2. Razones
Aunque Windows para computadoras con software Intel es actualmente el sistema operativo más popular, debido a vulnerabilidades y errores inherentes al sistema Windows, las aplicaciones pueden causar que el sistema operativo falle (a veces el propio sistema operativo también se paralizará inexplicablemente). ). Elegir un entorno de desarrollo más estable es la solución. Los siguientes pasos pueden ayudarle a evitar algunos conflictos de acceso:
(1) Aunque Windows NT/2000 ha demostrado ser un entorno más estable entre el popular Windows 9X, casi todas las plataformas Windows.
(2) Asegúrese de que Windows NT/2000 tenga instalado el último service pack. Cada vez que instala una nueva versión del service pack, encontrará que la máquina se estabiliza.
(3) Utilice las actualizaciones o parches actuales (BDE, ADO...) por usted, lo cual es una buena manera de evitar que varias versiones de Delphi salgan mal de antemano. Intente utilizar el último parche de Delphi: los errores de infracción de acceso, algunos errores, especialmente los errores de diseño, se reducirán considerablemente.
(4) Si a menudo encuentra errores de violación de acceso aleatoriamente en el IDE, es probable que haya instalado un paquete o asistente mal controlado, que no es la versión que escribió o compiló con Delphi. Intente desinstalar un control (o paquete) personalizado hasta que se resuelva el problema, luego comuníquese con el proveedor del control preocupado por el resultado de este problema.
(5) Revise la computadora en busca de cosas inútiles y conflictos de programas. Las versiones de prueba de programas y productos de software extraños suelen provocar errores de infracción de acceso.
(6) Si hay errores en la configuración del sistema, pueden ocurrir errores de violación de acceso con frecuencia. Si encuentra con frecuencia mensajes de error de infracción de acceso similares, registre estos detalles y luego notifique al fabricante del software que puede haber causado el error.
Las anteriores son mis sugerencias para el diseño incorrecto de violaciones de acceso.
2. ¿Conflicto de acceso a la operación Delphi? ¿Cómo prevenirlo?
Cualquier desarrollo de software se encontrará con esta situación: escribes un programa, lo pruebas y luego lo envías a todas partes, y los resultados del usuario te dirán que fallaste.
Considere compilar su programa con la directiva del compilador {$D}: Delphi puede crear un entorno para encontrar archivos fuente con violaciones de acceso, lo cual es beneficioso. El cuadro de diálogo Opciones del proyecto (Proyecto | Opciones | Conectores y compiladores) le permite especificar todo lo que necesita. Para los archivos de unidad, la información de depuración se registra con la unidad en el archivo de código objeto. Si utiliza un programa nativo al compilar, la información de depuración aumentará la unidad de tamaño del archivo, lo que agregará una sobrecarga de memoria adicional, pero no afectará el tamaño y la velocidad del archivo ejecutable final. Los productos que incluyen información de depuración y opciones de archivos de imagen (Proyecto | Opciones | Conector) solo completarán la siguiente línea de información después de la directiva del compilador {$D}.
Las violaciones de acceso generalmente indican un aspecto del programa. Cuando surge un problema por primera vez, es muy importante considerar cómo son los usuarios de dispositivos móviles y luego encontrar un gran avance a partir de ahí. Pero desde la perspectiva del usuario, si su programa deja de hacer su trabajo, le dirán que el problema parece haber ocurrido y le pedirán que extienda el tiempo para resolverlo. Sin embargo, la única forma eficaz es permitir que los usuarios interactúen, identifiquen problemas y mejoren el programa.
Ahora podrás saber cómo encontrar fácilmente la ruta exacta al archivo de código fuente y la línea de error de infracción de acceso solo te da la dirección del conflicto:
"Buscar - Buscar error...."
Cuando se produce una infracción de acceso al tiempo de ejecución, los usuarios reciben un mensaje de error similar al siguiente:
Infracción de acceso en la dirección del módulo
Leer dirección
Si su programa contiene información de compilación y depuración en el IDE de Delphi, puede navegar hasta la línea de código fuente que causa el error.
En los programas Delphi, una de las causas más comunes de errores de infracción de acceso es que el objeto no ha sido creado ni utilizado. Si la segunda dirección es FFFFFFF o 0000000, ¿nueve de cada diez veces la visitarás? El objeto aún no ha sido creado. Por ejemplo, llama a un evento en un formulario, pero el formulario no se crea automáticamente y no se crea una instancia mediante código.
Programa TfrMain. OnCreate(remitente: al objeto);
Variante BadForm: tbad form;
/gt; //Comience aquí
Mal comportamiento;
Fin;
Supongamos que BadForm está en la lista de la ventana "Formularios disponibles" en las opciones del proyecto; esta ventana debe crearse y publicarse manualmente. Llamar al método de actualización de la ventana BadForm en el código anterior provocará una infracción de acceso.
Si abre la ventana de opciones del depurador "Detener los efectos de excepción de Delphi", aparecerá el siguiente mensaje:
Este mensaje indica que la EAccessViolation que ocurrió es una clase de excepción. Acerca de
En este punto verá información sobre el proceso de diseño, aparecerá el siguiente cuadro de mensaje y el programa falló.
Infracción de acceso en la dirección 0043F193.
Leer el módulo "Project1.exe".
El primer número hexadecimal 0043F193 es el código ensamblador de la dirección donde ocurrió la infracción de acceso durante el tiempo de ejecución (como Project1.exe). En el IDE, seleccione el elemento del menú | Luego seleccione "Buscar errores..." e ingrese la dirección donde ocurrió el error (0043F193) en el cuadro de diálogo y haga clic en el botón "Aceptar". Delphi recompilará el archivo de su proyecto y luego mostrará un error en la línea que ejecuta el código, en este caso la línea BadForm.Refresh.
Las causas más comunes de errores de infracción de acceso en entornos Delphi se enumeran a continuación. Esta lista no cubre ni puede cubrir todas las posibles situaciones de infracción de acceso. En el foro, envíe información contradictoria sobre su visita y podremos intentar resolverlo juntos; según la lista, generalmente hay más errores que ejemplos oscuros del mundo real.
1. Llamar a un objeto que no existe.
Como se mencionó anteriormente, la causa más razonable de una infracción de acceso es que el objeto no haya sido utilizado o haya sido liberado para crearlo. Para evitar este tipo de infracción de acceso, primero debe crear cualquier objeto. Por ejemplo, puede abrir la tabla en el evento OnCreate del formulario cuando la tabla ubicada en el módulo de datos aún no ha sido creada (eliminando la ventana del autoconcreto).
En el siguiente código, el objeto de llamada ha sido eliminado: después del evento (TBitmap of b), se produce una infracción de acceso:
Variante b: tbit map;
inicio b:= tbit map .create;
//BEl objetivo de ciertas acciones
b .free;
Fin;
p>..
//Debido a que B ha sido liberado, se producirá un error de infracción de acceso.
B.Canvas.TextOut(0, 0, 'Esto es una infracción de acceso');
End; Si al pasar parámetros a las funciones de Win API, aparecerá un error de infracción de acceso a parámetros de API.
. La mejor manera de resolver este error de infracción de acceso es acceder a la ayuda de la implementación de Win API. Consulte la información de parámetros y los tipos de parámetros de las llamadas a funciones API. Por ejemplo, asegúrese siempre de no pasar un argumento de búfer con un puntero no válido.
3. Permitir que Delphi publique
Borras un objeto cuando tiene otro objeto. Porque de forma predeterminada, todos los formularios (creados automáticamente) pertenecen al objeto Aplicación. Al finalizar la aplicación, libera el objeto de la aplicación, que se publica en todas sus formas. Por ejemplo, si se crean automáticamente dos formularios (Form1/Unit1 y Form2/Unit2) cuando se inicia el programa, el siguiente código provocará un error de infracción de acceso:
Unidad 1
... .
Utilice la segunda unidad;
...
Tabla de programas 1. Llame al Formulario 2
Formulario 2. ShowModal
Formulario 2. Gratis;
//Una infracción de acceso provocará un error.
Tabla 2. ShowModal termina;
4 Kill Exception
Nunca destruyas el objeto de excepción temporal (e), el manejo de excepciones liberará automáticamente el objeto de excepción. Si el objeto de excepción se libera manualmente, el programa intentará liberarlo nuevamente y luego se producirá un error de infracción de acceso:
Cero:=0;
Dumb:=10/ cero; excepto... Afuera
En e:. EZeroDivide tiene
MessageDlg('! No se puede dividir por 0", mtError, [MBOK], 0);
E.free//// el conflicto de acceso provocará un error.
p>Fin;
五
Recupera una cadena vacía sin datos.
En otras palabras, una cadena vacía equivale a un acceso a un objeto recuperado inexistente, lo que resultará en un error de infracción de acceso:
Variante s: cadena
s: =" "; s[1]:= 'A';
// La infracción de acceso provocará un error.
Fin;
6 Punteros de referencia directa
Debes ser indirectos. Haga referencia al puntero; de lo contrario, se cambiarán la dirección del puntero y otras unidades de almacenamiento que pueden destruirse:
procesar t formulario 1. botón 1 clic (de hasta objeto);
P1: puntero;
p>
P2: puntero;
Función Getmem (P1, 128);
Función Getmem (P2, 128); p>
//Siguiente línea Provoca un error de infracción de acceso.
Mover (P1, P2, 128);
//El método para la siguiente línea es correcto.
Móvil (P1, P2, 128);
Freemem (p1, 128);
FreeMem (P2, 128); >Fin;
Todas estas sugerencias son mis errores de infracción de acceso al tiempo de ejecución. Con suerte cometerá un error y su programa tendrá una infracción de acceso.