Externe exception C0000006
J'ai écrit un programme en Delphi et quand je suis en cours d'exécution à partir d'un disque sur la touche. À un certain moment, je suis tenu de débrancher le disque sur la touche pendant que l'application est en cours d'exécution. Si je fais cela sur un ordinateur avec au moins 1 go de ram tout est ok. Quand je fais cela sur une machine avec 512 mo de mémoire, je reçois un externe exception C0000006. Si je ne me trompe pas, c'est parce que l'OS est d'essayer de lire la ligne suivante de code mais impossible de trouver de la ressource pour elle (ce qui signifie que l'application n'était pas chargée dans la mémoire vive) ce qui est absurde parce que c'est un 500kb application.
Comment puis-je résoudre ce problème? ou au moins gérer cette exception dans un moyen plus élégant? (Puisque je ne peux pas l'attraper car il est un externe exception).
Oh, et mon Delphi application est une application console sous windows xp.
- 0xC0000006 et d'autres exceptions sont énumérées ici: support.tabs3.com/main/R10309.htm
Vous devez vous connecter pour publier un commentaire.
Ce que vous devez faire est de dire à windows de charger l'ensemble de votre programme en mémoire, plutôt que de permettre à la demande de chargement des pages quand il en a besoin. Je l'ai fait avec succès pour des applications en cours d'exécution hors d'un CD. Je n'ai pas le code avec moi, mais je me souviens que j'ai trouvé les conseils sur la façon de le faire dans la source pour le fantastique open-source installer le programme Inno Setup.
Edit: en Fait, après avoir fait un peu de recherche, vous pouvez utiliser un compilateur Delphi directive de demander à windows de charger la totalité du fichier exécutable. Cela fonctionne si vous avez Delphi > 2006. Cela aura pour effet que vous n'obtiendrez jamais l'externe exception.
Mettre cette ligne dans vos applications fichier de projet:
Cela indique à windows que l'exécutable est destiné à être utilisé à partir d'un support amovible, de sorte que la charge de la l'exécutable en mémoire (ou le fichier d'échange). Ensuite, vous n'avez pas besoin de vous soucier de choses comme la copie le fichier sur la machine en premier, etc.
Edit 2: j'ai actuellement accès à Delphi 7 et je peux le confirmer, comme indiqué par d'autres, que cela fonctionne aussi avec Delphi 7 (et probablement Delphi 6) avec le code suivant:
Pour Delphi < 6, vous pouvez aller sur le chemin de forcer l'exécutable à être envoyés. Il est un exemple de comment le faire en C++ ici (à moins de trouver un moyen de modifier l'en-tête PE drapeaux après le moment de la liaison, qui a l'air d'être compliqué)
N@
program
ligne avant.C'est
EXCEPTION_IN_PAGE_ERROR
. Cela signifie que le chargeur du système d'exploitation a échoué à la page d'une partie des données nécessaires pour l'exécution de l'application, probablement en raison d'une erreur d'e/S ou d'une autre erreur. Puisque vous êtes en train de retirer le disque, qui aurait du sens.Peut-être le jeu de travail (l'ensemble de souvent utilisé les pages de mémoire) pour l'application a été autorisé à acquérir une taille suffisante sur 1 go de machines telles que le recours au disque pour recharger les pages n'était pas nécessaire, mais ce n'était pas le cas sur les 512 mo de machines?
Je suggère d'essayer de copier l'exécutable dans un emplacement temporaire et de commencer à partir de là, peut-être avec la suppression tardive; ou utiliser un autre mécanisme de garantie sur disque de sauvegarde pour toutes les pages de mémoire touché par l'application dans des conditions normales d'utilisation, et d'éviter cette erreur en cas de sollicitation de la mémoire, où le système d'exploitation découper le jeu de travail de processus en cours d'exécution.
Comme @Barry, je voudrais vous recommandons de vérifier le type de lecteur du volume que votre exécutable s'exécute à partir d'; si c'est un disque amovible (et manque un "déjà en temp" paramètre de ligne de commande) copie de l'exécutable (et ses dépendances) de l'utilisateur
%TEMP%
dossier de et puis re-lancement à partir de là avec un supplément de paramètre de ligne de commande pour indiquer "déjà en temp".File.Create(targetPath, bufferSize, FileOptions.DeleteOnClose)
(ou l'un desFileStream
constructeurs qui prend unFileOptions
paramètre), mais assurez-vous de s'accrocher à l'retournéFile
instance jusqu'à ce que après la deuxième copie est lancé (par exemple dans uneList<File>
).Close()
sur chacun desFile
instances enregistré ci-dessus.Cette façon, les fichiers se ferment, quel que soit le processus qui termine en premier, et le volume source peut être retiré plus tôt.
La solution
est disponible pour Delphi depuis la version 6.
Il y a un Delphi version de travail de RunImageLocally de MSJ laquelle les forces de l'exécutable/dll à être envoyés. Cela peut empêcher C0000006 erreurs lors de l'exécution de réseau ou un support amovible...
Vérifier à https://github.com/jrsoftware/issrc/blob/master/Projects/SetupLdr.dpr
Cette exception C0000006 aussi souvent se produit si votre logiciel est exécuté à partir d'un lecteur réseau. Pour éviter ce problème, que vous pouvez combiner le drapeau
avec l'indicateur suivant: