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—