solucion c00006 delphi exception error-handling windows-xp

c00006 - delphi raise exception



Excepción externa C0000006 (6)

Como @Barry, recomendaría verificar el tipo de unidad del volumen desde el cual se ejecuta su ejecutable; si es una unidad extraíble (y le falta un parámetro de línea de comando "ya en temp"), copie el archivo ejecutable (y cualquiera de sus dependencias) en la carpeta %TEMP% del usuario y luego vuelva a iniciarlo desde allí con un parámetro de línea de comando adicional para indicar "ya en temp".

  1. Cree cada archivo temporal utilizando File.Create(targetPath, bufferSize, FileOptions.DeleteOnClose) (o uno de los constructores de FileStream que toma un parámetro FileOptions ), pero asegúrese de mantener la instancia del File devuelto hasta que se inicie la segunda copia (por ejemplo, en una List<File> ).
  2. Copia los contenidos de cada archivo.
  3. Ejecuta el ejecutable desde la carpeta temporal.
  4. Llame a Close() en cada una de las instancias de File guardadas anteriormente.
  5. Salga del ejecutable original.

De esta manera, los archivos se cierran independientemente del proceso que finalice primero, y el volumen de origen se puede eliminar antes.

Escribí un programa en Delphi y cuando lo ejecuto desde un disco en la llave. En algún momento, debo desenchufar la llave del disco mientras se ejecuta la aplicación. Si hago esto en una computadora con al menos 1 GB de RAM, todo está bien. Cuando hago esto en una máquina con 512 mb, obtengo una excepción externa C0000006. Si no me equivoco, esto se debe a que el sistema operativo está intentando leer la siguiente línea de código pero no puede encontrar el recurso para eso (es decir, la aplicación no se cargó en el ram), lo cual es absurdo porque es una aplicación de 500 kb.

¿Como puedo resolver esto? ¿O al menos manejar esta excepción de una manera más elegante? (Ya que no puedo atraparlo ya que es una excepción externa).

Ah, y mi aplicación Delphi es una aplicación de consola bajo Windows XP.


Eso es EXCEPTION_IN_PAGE_ERROR . Esto significa que el cargador del sistema operativo no pudo encontrar algunos datos requeridos para que la aplicación se ejecute, probablemente debido a un error de E / S u otro error. Ya que estás quitando el disco, eso tendría sentido.

Tal vez se permitió que el conjunto de trabajo (el conjunto de páginas de memoria de uso frecuente) para la aplicación creciera lo suficiente en máquinas de 1 GB, por lo que no era necesario recurrir al disco para volver a cargar las páginas, pero ese no era el caso en máquinas de 512 MB ?

Sugeriría intentar copiar el archivo ejecutable en una ubicación temporal e iniciarlo desde allí, posiblemente con eliminación retrasada; o use algún otro mecanismo para garantizar el respaldo en disco para todas las páginas de memoria que la aplicación toque en el uso normal, y evite este error en casos de presión de memoria, donde el sistema operativo ajustará el conjunto de trabajo de los procesos en ejecución.


Esta excepción C0000006 también ocurre a menudo si su software se ejecuta desde una unidad de red. Para evitar ese problema puedes combinar la bandera.

{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

con la siguiente bandera:

IMAGE_FILE_NET_RUN_FROM_SWAP = $0800; {$SetPEFlags $0C00}



La solución

uses Windows; {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP}

Está disponible para Delphi desde la versión 6 .


Lo que debe hacer es decirle a Windows que cargue todo el programa en la memoria, en lugar de permitirle que cargue páginas cuando sea necesario. Lo he hecho con éxito para las aplicaciones que se ejecutan desde un CD. No tengo el código conmigo en este momento, pero recuerdo que encontré sugerencias sobre cómo hacerlo en el código fuente del fantástico programa de instalación de código abierto Inno Setup.

Edición: en realidad, después de investigar un poco, puedes usar una directiva del compilador de Delphi para decirle a Windows que cargue el ejecutable completo. Esto funciona si tiene Delphi> 2006. Esto tendrá el efecto de que nunca obtendrá la excepción externa.

Ponga esta línea en su archivo de proyecto de aplicaciones:

{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

Esto le indica a Windows que el archivo ejecutable se va a utilizar desde medios extraíbles, así que cargue el archivo ejecutable en la memoria (o el archivo de intercambio). Entonces no necesita preocuparse por cosas como copiar primero el archivo a la máquina, etc.

Edición 2: actualmente tengo acceso a Delphi 7 y puedo confirmar, como han señalado otros, que esto también funciona con Delphi 7 (y probablemente Delphi 6) con el siguiente código:

const IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400; {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP}

Para Delphi <6, puede ir por el camino de forzar el ejecutable para que se pagine. Hay un ejemplo de cómo hacerlo en C ++ here (a menos que encuentre una manera de modificar los indicadores de encabezado PE después del tiempo de enlace, que parece ser complicado)

NORTE@