Points d'entrée de fonction DLL exportée
Pour les fonctions exportées d’une DLL, utilisez la macro AFX_MANAGE_STATE pour maintenir l’état global approprié lors du basculement du module DLL vers la DLL de l’application appelante.
En cas d'appel, cette macro définit pModuleState
, un pointeur vers une structure AFX_MODULE_STATE
contenant des données globales du module, comme l'état du module efficace pour le reste de l'étendue contenante de la fonction. En sortant de l'étendue contenant la macro, l'état du module effectif précédent est automatiquement restauré.
Ce basculement est obtenu en construisant une instance d’une AFX_MODULE_STATE
classe sur la pile. Dans le constructeur, cette classe obtient un pointeur vers l'état du module en cours et l'enregistre dans un attribut, puis définit pModuleState
comme nouvel état du module effectif. Dans le destructeur, cette classe restaure le pointeur stocké dans une variable membre en tant qu'état du module effectif.
Si vous avez une fonction exportée, telle qu'une fonction qui affiche une boîte de dialogue dans votre DLL, vous devez ajouter le code suivant au début de la fonction :
AFX_MANAGE_STATE(AfxGetStaticModuleState())
Cela échange l’état actuel du module avec l’état retourné par AfxGetStaticModuleState jusqu’à la fin de l’étendue actuelle.
Les problèmes avec des ressources dans les DLL se poseront si la macro AFX_MANAGE_STATE
n'est pas utilisée. Par défaut, MFC utilise le handle de ressource d'application principale pour charger le modèle de ressources. Ce modèle est réellement enregistré dans la DLL. La cause racine est que les informations d’état du module MFC n’ont pas été basculées par la macro AFX_MANAGE_STATE
. Le handle de ressources est récupéré de l'état du module MFC. Ne pas afficher l'état du module provoque l'utilisation du mauvais handle de ressource.
AFX_MANAGE_STATE
n'a pas besoin d'être placé dans chaque fonction de la DLL. Par exemple, InitInstance
peut être appelé par du code MFC dans l'application sans AFX_MANAGE_STATE
car MFC déplace automatiquement l'état du module avant InitInstance
, puis le restaure après le retour de InitInstance
. Il en va de même pour tous les gestionnaires de table des messages. Les DLL MFC standard ont en fait une procédure de fenêtre maître spéciale qui bascule automatiquement l’état du module avant de router un message.