2009-02-10 6 views
3

Par exemple, je souhaite créer une DLL exportant une fonction appelée ShowDialog, qui affiche une boîte de dialogue et modifie le texte dans l'un des boutons de la boîte de dialogue. La boîte de dialogue et toutes les autres ressources doivent être regroupées dans la DLL.Création de ressources dans une DLL pour réutilisation, MFC/VC++

J'ai fait un test rapide et lorsque la DLL essaie GetDlgItem() avec un certain ID de contrôle, il obtient un pointeur null. Je suppose que d'autres étapes sont nécessaires pour gérer correctement les ressources dans ce cas.

Répondre

3

De MSDN:

Par défaut, MFC utilise la ressource poignée de l'application principale pour charger le modèle de ressources. Si vous avez une fonction exportée dans une DLL, telle que celle qui lance une boîte de dialogue dans la DLL , ce modèle est en réalité stocké dans le module DLL. Vous devez activer l'état du module pour la poignée correcte à utiliser. Vous pouvez le faire en ajoutant le code suivant au début de la fonction:

AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
4

Est-ce que vous faites quelque chose comme ce qui suit aux points d'entrée à votre DLL?

AFX_MANAGE_STATE(AfxGetStaticModuleState()) 

Cochez cette case technote here about MFC module state. Il existe différents types d'état de module MFC, l'état du module est celui avec lequel vous interagissez le plus souvent.

Ce permute l'état actuel du module avec l'état retourné de AfxGetStaticModuleState jusqu'à la fin de la portée actuelle.

Des problèmes se produisent avec les ressources dans les DLL si la macro AFX_MODULE_STATE est non utilisée. Par défaut, MFC utilise le handle de ressource de l'application principale pour charger le modèle de ressources. Ce modèle est actuellement stocké dans la DLL. La cause première est que l'information d'état du module MFC n'a pas été activée par la macro AFX_MODULE_STATE . Le handle de ressources est récupéré à partir de l'état du module du MFC. Si vous ne changez pas l'état du module , le mauvais handle de ressource est utilisé .

+0

Merci. Bien que cette réponse porte plus d'informations, j'ai sélectionné l'autre pour être la bonne réponse, car appeler AFX_MANAGE_STATE au point d'entrée de la DLL ne résout pas le problème. – sharkin

+0

Oui, c'est le cas. Les points d'entrée de la DLL sont tous les points que le code externe peut appeler dans votre module. Je présume que vous pensiez que je voulais dire quelque chose comme dans DLLMain ou un tel endroit –

+0

Oui, je l'ai fait, désolé pour le malentendu. – sharkin

Questions connexes