Polytech`Orléans SPE4 - ESI Génie Logiciel TDER : DLL
Transcription
Polytech`Orléans SPE4 - ESI Génie Logiciel TDER : DLL
Polytech’Orléans SPE4 - ESI Génie Logiciel TDER : DLL 1. Création d’une classe de base réutilisable La classe CPersistentFrame permet la sauvegarde de plusieurs paramètres de l’application (taille et position de la fenêtre, états maximisé et réduit, activation des barres d’outil et d’état. Pour cela, elle utilise les registres Windows. (Les fichiers de la classe CPersistentFrame se trouvent sur l’intranet en cliquant sur les liens suivant : Formation – Filière ESI – Documents pédagogiques – Génie logiciel) 1. Exécuter AppWizard pour créer une application Dea (Deuxième exemple d’application). Sélectionnez « Mono document (SDI) » et désactiver « Impression et aperçu avant impression ». 2. Modifier Mainfrm.h de manière à faire hériter la classe CMainFrame de la classe CPersistentFrame au lieu de la classe CFrameWnd. 3. Dans MainFrm.cpp, remplacer toutes les occurrences de CFrameWnd par CPersistentFrame, et personnalisez à votre application la ligne SetRegistryKey(_T("…"));. Modifier Dea.h en remplaçant également CFrameWnd par CpersistentFrame, et en insérant la ligne #include "persist.h". 4. Ajouter les fichiers persist.h et persist.cpp au projet en utilisant l’option « Ajouter un élément existant » du menu Projet. 5. Construire et tester l’application DEA. 6. Examiner le registre de Windows (lancer l’application C:\WINNT\REGEDIT). Déplacez-vous sur la clé HKEY_CURRENT_USER\Software\DEA\DEA et visualisez le contenu des variables. 7. Relever la taille du fichier exécutable dea.exe et celle du fichier objet persist.obj, à la fois pour les deux versions Debug et Release. Qu’en déduisez-vous ? Compléter le tableau de la question 3.6. 2. Création d’une DLL d’extension MFC 1. Exécuter AppWizard pour créer une DLL Ped [Premier exemple de DLL]. Sélectionnez l’option DLL MFC au lieu de l’option par défaut Application MFC. Choisir l’option « DLL d’extension MFC » dans le seul écran AppWizard. 2. Examiner le fichier Ped.cpp, et plus particulièrement la fonction DllMain. 3. Ajouter les fichiers persist.h et persist.cpp au projet (menu « Projet », sous-menu « Ajouter un élément existant »). 4. Modifier le fichier Persist.h en remplaçant la ligne class CPersistentFrame : public CFrameWnd par class AFX_EXT_CLASS CPersistentFrame : public CFrameWnd. 5. Compiler le projet. 6. Pour les deux versions Debug et Release, relever les tailles des fichiers ped.dll, persist.obj et Ped.lib. Qu'en déduisez-vous ? Compléter le tableau de la question 3.6. Vérifier si les deux fichiers Ped.lib des versions Debug et Release sont identiques. —1— 3. Création d’une application cliente pour tester la DLL d’extension MFC 1. Exécuter AppWizard pour créer une application Tea [Troisième exemple d’application]. Sélectionnez Mono document (SDI). 2. Copier le fichier persist.h dans le répertoire courant, et le fichier Ped\Debug\Ped.dll dans le répertoire Tea\Debug. 3. Remplacer la classe de base de CMainFrame par CPersistentFrame. Insérer la ligne #include "persist.h" dans le fichier MainFrm.h. 4. Ajouter la bibliothèque d’importation de Ped à la liste des bibliothèques traitées par l’éditeur de lien. 5. Construire et tester l’application Tea. 6. Relever les tailles des fichiers exécutables debug/tea.exe et release/tea.exe et compléter le tableau suivant. Que déduisez-vous de toutes les valeurs relevées ? Version Debug Version Release Dea.exe Persist.obj Ped.lib Ped.dll Persist.obj Tea.exe —2— Remarques 4. Création d’une DLL conventionnelle Le but de cette partie est de créer une DLL permettant la résolution d’une équation du second degré. La structure du programme sera la suivante : CSolution public: CSolution() ; ~CSolution() ; virtual CString Calcul() = 0 ; CSol0 CSol1 CSol2 public: CSol0(double dA,double dB, double dC,double dDisc) ~CSol0() CString Calcul() public: CSol1(double dA,double dB, double dC,double dDisc) ~CSol1() CString Calcul() public: CSol2(double dA,double dB, double dC,double dDisc) ~CSol2() CString Calcul() dA, dB et dC représentent les coefficients de l’équation du second degré, et dDisc la valeur du discriminant. La fonction Calcul() retourne la solution sous la forme d’une chaîne de caractères. CSol0 sera appelée si l’équation n’a pas de solution, CSol1 si elle a une solution, et CSol2 si elle a deux solutions. 1. Exécuter AppWizard pour créer une DLL Ded [Deuxième exemple de DLL]. Sélectionnez l’option DLL MFC et choisissez l’option « DLL normale utilisant une DLL MFC partagée ». 2. Examiner le fichier Ded.cpp. 3. Implémenter les différentes classes présentées précédemment. 4. Dans Ded.cpp, ajouter et compléter le code suivant afin de résoudre l’équation du second degré : extern "C" __declspec(dllexport) CString Resoudre(double dA, double dB, double dC) { TRACE ("Entrée dans la fonction Resoudre\n") ; double dDisc = dB*dB - 4.*dA*dC; if (dDisc < 0) if (dDisc == 0) if (dDisc > 0) return ; } 5. Compilez le projet. —3— 5. Modification de l’application cliente pour tester la DLL conventionnelle 1. Copier le fichier Ded\Debug\Ded.dll dans le répertoire Tea\Debug. Penser à ajouter la bibliothèque d’importation de Ded à la liste des bibliothèques traitées par l’éditeur de lien. 2. Ajouter à l’application précédente Tea une nouvelle ressource de dialogue et une nouvelle classe associée. Utiliser l’éditeur graphique pour créer le modèle suivant : Générer une classe CScdDgrDlg dérivée de CDialog, dont les contrôles, données membres et fonction d’interception seront les suivants : ID Contrôle IDC_COEF_A IDC_COEF_B IDC_COEF_C IDC_RESULTAT IDC_COMPUTE Type Zone de texte Zone de texte Zone de texte Zone de texte Bouton Donnée membre m_dA (double) m_dB (double) m_dC (double) m_sRes (CString) Fonction correspondante OnCompute 2. Modifiez la fonction OnCompute() générée par AppWizard pour appeler la fonction exportée de la DLL : void CScdDgrDlg::OnCompute() { UpdateData(TRUE) ; m_sRes = Resoudre(m_dA, m_dB, m_dC); UpdateData(FALSE) ; } Vous devez déclarer Resoudre comme fonction importée en ajoutant la ligne suivante au fichier ScdDgrDlg.cpp : extern "C" __declspec(dllimport) CString Resoudre(double a,double b,double c); 3. Ajoutez un menu Test et générer la fonction associée dans la classe CTeaDoc. Ajouter le code afin que cette option du menu affiche la boîte de dialogue. 4. Construire l’application et testez-la. 5. Utiliser la fonction GetModuleHandle() pour récupérer le handle de l'application et des dll. Même chose pour les fichiers dll de la bibliothèque MFC. Qu'en déduisez-vous ? 6. Utilisation d’une DLL conventionnelle à partir d’une application générée par un autre langage 1. Utiliser la fonction OnCompute() de la DLL Ded.dll dans une application MFC Win32 Console, application écrite en C. —4—