Points d'entrée exportés de fonction DLL
Pour les fonctions exportées à partir d'une DLL, utilisez la macro d' AFX_MANAGE_STATE pour maintenir l'état global approprié en basculant du module DLL à la DLL de l'application appelante.
Lorsqu'elle est appelée, cette macro définit pModuleState, un pointeur vers une structure d' AFX_MODULE_STATE contenant des données globales pour le module, comme état du module efficace pour le reste de la portée contenante de la fonction.En cas de laisser la portée contenant la macro, l'état du module efficace précédent est automatiquement restaurée.
Cette basculement est accomplie à construire une instance d'une classe d' AFX_MODULE_STATE sur la pile.Dans son constructeur, cette classe obtient un pointeur vers l'état du module en cours et le stocke dans une variable membre, puis définit pModuleState en tant que nouvel état du module efficace.Dans son destructeur, cette classe restaure le pointeur stocké dans sa variable membre comme état du module efficace.
Si vous avez une fonction exportée, telle qu'une qui lance une boîte de dialogue dans la DLL, vous devez ajouter le code suivant au début de la fonction :
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
Cela fait passer l'état du module en cours avec l'état retourné d' AfxGetStaticModuleState jusqu'à la fin de la portée actuelle.
Les problèmes avec les ressources dans les DLL se poseront si la macro d' AFX_MANAGE_STATE n'est pas utilisée.Par défaut, MFC utilise le handle de la ressource de l'application principale de charger le modèle de ressource.Ce modèle est stocké en fait dans la DLL.La cause première est que les informations d'état du module MFC n'ont pas été basculées par le d' AFX_MANAGE_STATE .Le handle de la ressource est récupérée de l'état du module MFC.Ne pas changer l'état du module provoque le handle de la ressource incorrect à utiliser.
AFX_MANAGE_STATE n'a pas besoin d'être placés dans chaque fonction dans la DLL.Par exemple, InitInstance peut être appelé par du code MFC dans l'application sans AFX_MANAGE_STATE car les MFC déplace automatiquement l'état du module que InitInstance puis les commutateurs il arrière après qu' InitInstance retourne.Il en va de même pour tous les gestionnaires de table des messages.Les DLL normales liées de manière ont réellement une procédure de fenêtre de page maître spéciale qui bascule automatiquement l'état du module avant de router tout message.