Il y a longtemps, j'ai découvert que je recevais des violations d'accès dans mon code en raison de l'utilisation des boîtes de dialogue Ouvrir fichier Delphi et/ou Enregistrer fichier qui encapsulent les boîtes de dialogue Windows . J'ai posé quelques questions sur quelques forums et on m'a dit que cela pouvait être dû à la façon dont certains programmes ajoutent des hooks au système shell qui entraînent l'injection de DLL dans tous les processus, dont certains peuvent causer des ravages avec un programme. Pour mémoire, l'environnement de programmation que j'utilise est Delphi 6 Professional fonctionnant sous Windows XP 32 bits. À l'époque je l'ai contourné en n'utilisant pas les composants Dialog de Delphi et en appelant directement directement dans comdlg32.dll. Cela a résolu le problème à merveille.Violations d'accès dans des endroits étranges lors de l'utilisation des boîtes de dialogue Windows
Aujourd'hui, je travaillais avec des fichiers mappés en mémoire pour la première fois et, bien sûr, les violations d'accès ont commencé à apparaître dans des parties étranges du code. J'ai essayé mes appels directs de comdlg32.dll et cette fois cela n'a pas aidé. Pour isoler le problème en tant que test, j'ai créé une zone de liste avec exactement les mêmes fichiers que j'utilisais pendant les tests. Ce sont exactement les mêmes fichiers de test que je sélectionnais dans une boîte de dialogue Ouvrir un fichier et ensuite lancer mon fichier mappé en mémoire avec. Je configure les choses de sorte qu'en cliquant sur un fichier dans la zone de liste, j'utilise ce fichier dans mon test de fichier mappé en mémoire au lieu d'appeler une fonction de dialogue comdlg32.dll pour sélectionner un fichier de test.
Encore, les violatons d'accès ont disparu. Pour vous montrer à quel point il était dramatique, je suis passé d'une violation d'accès dans 1 à 3 essais à aucun. Malheureusement, il va me mordre plus tard bien sûr quand j'ai besoin d'utiliser des boîtes de dialogue.
Est-ce que quelqu'un d'autre a traité ce problème aussi et a trouvé le vrai coupable? Est-ce que l'un d'entre vous a trouvé une solution que je pourrais utiliser pour résoudre ce problème au lieu de danser autour comme je le suis maintenant?
Merci d'avance.
Vous devez obtenir la pile où l'accident se produit. Utilisez NTSD et configurez les symboles publics. http://msdn.microsoft.com/en-us/library/cc266473.aspx –
Je n'ai jamais vu ce problème, mais une chose qui pourrait (peut-être) aider si vous êtes sur Delphi 6 est de remplacer le gestionnaire de mémoire avec FastMM4, qui est beaucoup plus stable que l'ancien. –
Bonjour Mason. J'utilise FastMM4 et j'ai effectué plusieurs tests avec chaque vérification détaillée que je pouvais trouver, en particulier pour vérifier la corruption du tas. Il n'a rien trouvé. L'accident se produit pendant une instruction de déplacement de mémoire dans mon programme, tout comme il y a longtemps. C'est comme si certaines DLL écrivaient sur un bloc de ma mémoire ou une variable contrôlant l'étendue du déplacement de la mémoire, mais ne le faisaient pas d'une manière qui corrompait les en-têtes de bloc de mémoire de FastMM4. Mais c'est de la spéculation de ma part puisque je ne connais pas la cause première. –