États du module d’une DLL MFC normale liée de manière dynamique à MFC
La possibilité de lier dynamiquement une DLL MFC standard à la DLL MFC permet certaines configurations très compliquées. Par exemple, une DLL MFC standard et l’exécutable qui l’utilise peuvent à la fois lier dynamiquement à la DLL MFC et à n’importe quelle DLL d’extension MFC.
Cette configuration pose un problème en ce qui concerne les données globales MFC, telles que le pointeur vers l’objet actuel CWinApp
et gérer les mappages.
Avant MFC version 4.0, ces données globales résident dans la DLL MFC elle-même et ont été partagées par tous les modules du processus. Étant donné que chaque processus utilisant une DLL Win32 obtient sa propre copie des données de la DLL, ce schéma a fourni un moyen simple de suivre les données par processus. En outre, étant donné que le modèle AFXDLL suppose qu’il n’y aurait qu’un CWinApp
seul objet et qu’un seul ensemble de cartes de handles dans le processus, ces éléments peuvent être suivis dans la DLL MFC elle-même.
Toutefois, avec la possibilité de lier dynamiquement une DLL MFC régulière à la DLL MFC, il est désormais possible d’avoir deux objets ou plus CWinApp
dans un processus , ainsi que deux ou plusieurs ensembles de cartes de handle. Comment MFC effectue-t-il le suivi de ceux qu’il doit utiliser ?
La solution consiste à donner à chaque module (application ou DLL MFC standard) sa propre copie de ces informations d’état globales. Par conséquent, un appel à AfxGetApp dans la DLL MFC standard retourne un pointeur vers l’objet CWinApp
de la DLL, et non celui de l’exécutable. Cette copie par module des données globales MFC est appelée état de module et est décrite dans la note technique MFC 58.
La procédure de fenêtre commune MFC bascule automatiquement vers l’état correct du module. Vous n’avez donc pas besoin de vous en soucier dans les gestionnaires de messages implémentés dans votre DLL MFC standard. Toutefois, lorsque votre exécutable appelle la DLL MFC standard, vous devez définir explicitement l’état du module actuel sur celui de la DLL. Pour ce faire, utilisez la macro AFX_MANAGE_STATE dans chaque fonction exportée à partir de la DLL. Pour ce faire, ajoutez la ligne de code suivante au début des fonctions exportées à partir de la DLL :
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))