Gestion des données d'état des modules MFC
Cet article explique les données d'état des modules de MFC et comment cet état est mis à jour lorsque le flux d'exécution (il faut du code de chemin d'accès via une application lors de l'exécution) entre et laisse un module. L'échange des états de modules avec les macros AFX_MANAGE_STATE et METHOD_PROLOGUE est également présenté.
Notes
Le terme « module » fait référence à un programme exécutable, ou à une DLL (ou un ensemble de DLL) qui s'exécutent indépendamment du reste de l'application, mais utilise une copie partagée de la DLL MFC.Un contrôle ActiveX est un exemple classique de module.
Comme illustré ci-dessous, MFC contient des données d'état pour chaque module utilisé dans une application. Des exemples de ces données sont les handles d'instance Windows (utilisées pour charger des ressources), les pointeurs vers les objets actuels d'une application CWinApp et CWinThread, les nombres de références de module OLE, et plusieurs maps qui maintiennent les connexions entre les handles d'objet Windows et les instances correspondantes d'objets MFC. Toutefois, lorsqu'une application utilise plusieurs modules, les données d'état de chaque module ne sont pas pour toute l'application. En revanche, chaque module possède sa propre copie privée des données d'état de MFC.
Données d'état d'un module unique (application)
Les données d'état d'un module sont contenus dans une structure et sont toujours disponibles via un pointeur à cette structure. Lorsque le flux d'exécution entre dans un module particulier, comme le montre l'illustration suivante, l'état du module doit être "actuel" ou "effectif". Par conséquent, chaque objet thread a un pointeur vers la structure efficace d'état de cette application. Conserver ce pointeur mis à niveau à tout moment est essentiel pour gérer l'état global de l'application et maintenir l'intégrité de l'état de chaque module. La gestion incorrecte de l'état global peut provoquer un comportement imprévisible de l'application.
Données d'état de modules multiples
En d'autres termes, chaque module est chargé de basculer correctement entre les états du module à tous ses points d'entrée. Un « point d'entrée » est n'importe quel emplacement où le flux d'exécution peut écrire le code du module. Les points d'entrée sont les suivants :