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