Dans mon application, je veux exécuter la logique au tout dernier moment. Le plus tard, le mieux.Quel est le tout dernier endroit où vous pouvez exécuter la logique dans un exécutable Windows?
La raison en est que je garde une trace de certains éléments de mon application (structures de données, ressources, ...), et à la fin de l'application, une routine regarde ces éléments et les rapports s'ils n'étaient pas correctement fermé, libéré, supprimé, ...
Jusqu'à présent, nous l'avons fait en utilisant plusieurs astuces.
La première astuce consistait à annuler la fonction _heap_term du temps d'exécution C (ainsi que certaines autres fonctions du C Run Time). L'avantage est que cela a fonctionné très bien, mais se limitait aux applications dans lesquelles le CRT a été lié statiquement dans
La deuxième astuce consistait à définir une variable globale comme ceci:.
#pragma init_seg(lib)
GlobalApplicationManager s_globalApplicationManager;
Le pragma fait que que cette variable globale est construite avant toutes les autres variables globales, et - plus important encore - qu'elle est détruite après toutes les autres variables globales. De cette façon, nous pouvons mettre la logique de vérification dans le destructeur de cette classe.
Le problème est qu'à partir de Windows 7, le destructeur n'est plus appelé dans certaines situations. En ce moment, il n'est pas clair ce qui influence cela, mais nous sommes sûrs qu'il n'est pas appelé si nous réussissons une connexion Oracle dans notre application.
Quelles sont les autres astuces pour exécuter du code aussi tard que possible dans une application?
Si les globals posent problème, la meilleure solution est peut-être de refactoriser votre code et de ne pas utiliser de globals. – ereOn
convenu. Si vous avez de la difficulté à gérer la durée de vie de vos ressources, à créer des hacks * supplémentaires *, rendre la vie encore plus difficile à gérer semble à peine la bonne façon de procéder. – jalf
@ereOn, je suis d'accord, mais les globales ne sont pas le seul problème. Ce que je veux, c'est une vérification intégrée des structures de données internes à la fin de l'application (y compris, et probablement le plus important, si toute la mémoire a été libérée correctement). Avant Windows 7, si notre application avait encore de la mémoire allouée à la toute fin, le développeur/tester/internaluser en était averti automatiquement. Cela a presque garanti que chaque développeur a été informé immédiatement de toute fuite de mémoire. Aucun outil externe n'était nécessaire, car les contrôles étaient intégrés. – Patrick