[MFC] DLL d'extension MFC : inconsistance de CWnd

DLL d'extension MFC : inconsistance de CWnd [MFC] - C++ - Programmation

Marsh Posté le 26-01-2007 à 22:43:35    

J'ai un problème avec une DLL d'extension MFC (celle disposant d'un objet CWinApp propre et pour laquelle ont doit insérer une instruction AFX_MANAGE_STATE(AfxGetStaticModuleState()) au début de chaque méthode)

 

Ma DLL admet un point d'entrée de type:

Code :
  1. void InitTheDLL(HWND hWndCaller)
  2. {
  3. AFX_MANAGE_STATE(AfxGetStaticModuleState())
  4. CWnd* pWnd = CWnd::FromHandle(hWndCaller);
  5. // En fait, je récupère souvent un CTempWnd... avec des caractéristiques un peu étranges malgré le bon m_hWnd
  6. // hWndCaller désigne en fait un CFrameWnd
  7. CFrameWnd* pFrameWnd = static_cast<CFrameWnd*>(pWnd);
  8. // les attributs du pFrameWnd retourné sont incohérents. Au moindre appel nécessitant l'un de ces attributs, je crash la DLL
  9. }
 

L'idée principale était de créer un plugin sous forme de DLL. Ce pluggin doit gérer une barre d'outils propre à la DLL, l'intégrer dans la fenêtre passée en argument de InitTheDLL() et gérer les commandes de la barre d'outils via l'objet CWinApp de la DLL. Problème : si je retire l'instruction AFX_MANAGE_STATE, je récupère des pointeurs CWnd valides mais je ne peux charger ma barre d'outils car le module de ressource chargé n'est pas celui de la DLL mais de l'application ayant appelé la DLL. Si je garde AFX_MANAGE_STATE, les pointeurs CWnd sont incohérents mais la création de la barre d'outils réussi!

 

J'ai fait une tentative avec une DLL standard utilisant les MFC (Juste la DllMain et les instructions de chargement des MFC). Ca marche mais je suis bien embêté pour intercepter les options de la barre d'outils! Pour l'instant, je me suis résigné à gérer une communication en deux temps. L'application à étendre via le pluggin gère les messages de la barre d'outils grace à une plage de commandes (ID_xxx) réservées.

 

Note: dans les deux cas, la DLL est chargée avec ::LoadLibrary. Les fonctions sont appelées grâce à GetProcAdress et un prototype de fonction.

 

Je voudrais bien faire marcher le premier modèle pour que la DLL gère elle même son comportement et réduire le couplage lié à cette architecture.


Message édité par slash33 le 26-01-2007 à 22:54:26
Reply

Marsh Posté le 26-01-2007 à 22:43:35   

Reply

Marsh Posté le 30-01-2007 à 07:27:06    

essaie d'isoler la récupération de pWnd en dehors de la zone définie par AFX_MANAGE_STATE :

Code :
  1. void InitTheDLL(HWND hWndCaller)
  2.     {
  3.         CWnd* pWnd = CWnd::FromHandle(hWndCaller);
  4.         {
  5.            AFX_MANAGE_STATE(AfxGetStaticModuleState())
  6.    
  7.    
  8.            CFrameWnd* pFrameWnd = static_cast<CFrameWnd*>(pWnd);
  9.         }
  10.    
  11.     }

Reply

Marsh Posté le 31-01-2007 à 13:50:09    

Hum. J'avais fait des essais mais j'avais un problème soit avec la récupération du CWnd* soit avec la création de la barre d'outils (code non présenté dans l'extrait de code)
 
Je vais continuer à creuser dans ce sens.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed