MFC - Bibliothèques

UNE libraryest un groupe de fonctions, classes ou autres ressources qui peuvent être mises à la disposition des programmes qui ont besoin d'entités déjà implémentées sans qu'il soit nécessaire de savoir comment ces fonctions, classes ou ressources ont été créées ou comment elles fonctionnent. Une bibliothèque permet à un programmeur d'utiliser facilement des fonctions, des classes et des ressources, etc. créées par une autre personne ou entreprise et de croire que cette source externe est fiable et efficace. Certaines fonctionnalités uniques liées aux bibliothèques sont -

  • Une bibliothèque est créée et fonctionne comme un programme normal normal, en utilisant des fonctions ou d'autres ressources et en communiquant avec d'autres programmes.

  • Pour implémenter ses fonctionnalités, une bibliothèque contient des fonctions dont d'autres programmes auraient besoin pour compléter leurs fonctionnalités.

  • En même temps, une bibliothèque peut utiliser certaines fonctions dont d'autres programmes n'auraient pas besoin.

  • Le programme qui utilise la bibliothèque est également appelé les clients de la bibliothèque.

Il existe deux types de fonctions que vous allez créer ou inclure dans vos bibliothèques -

  • Une fonction interne est une fonction utilisée uniquement par la bibliothèque elle-même et les clients de la bibliothèque n'auront pas besoin d'accéder à ces fonctions.

  • Les fonctions externes sont celles auxquelles les clients de la bibliothèque peuvent accéder.

Il existe deux grandes catégories de bibliothèques que vous traiterez dans vos programmes -

  • Bibliothèques statiques
  • Bibliothèques dynamiques

Bibliothèque statique

UNE static libraryest un fichier qui contient des fonctions, des classes ou des ressources qu'un programme externe peut utiliser pour compléter ses fonctionnalités. Pour utiliser une bibliothèque, le programmeur doit créer un lien vers celle-ci. Le projet peut être une application console, une application Win32 ou une application MFC. Le fichier de bibliothèque a l'extension lib.

Step 1 - Examinons un exemple simple de bibliothèque statique en créant un nouveau projet Win32.

Step 2 - Dans la boîte de dialogue Assistant Application, choisissez l'option Bibliothèque statique.

Step 3 - Cliquez sur Terminer pour continuer.

Step 4 - Cliquez avec le bouton droit sur le projet dans l'explorateur de solutions et ajoutez un fichier d'en-tête à partir de l'option de menu Ajouter → Nouvel élément….

Step 5 - Entrez Calculator.h dans le champ Nom et cliquez sur Ajouter.

Ajoutez le code suivant dans le fichier d'en-tête -

#pragma once
#ifndef _CALCULATOR_H_
#define _CALCULATOR_H_
double Min(const double *Numbers, const int Count);
double Max(const double *Numbers, const int Count);
double Sum(const double *Numbers, const int Count);
double Average(const double *Numbers, const int Count);
long GreatestCommonDivisor(long Nbr1, long Nbr2);
#endif // _CALCULATOR_H_

Step 6 - Ajoutez un fichier source (* .cpp) dans le projet.

Step 7 - Entrez Calculator.cpp dans le champ Nom et cliquez sur Ajouter.

Step 8 - Ajoutez le code suivant dans le fichier * .cpp -

#include "StdAfx.h"
#include "Calculator.h"
double Min(const double *Nbr, const int Total) {
   double Minimum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Minimum > Nbr[i])
         Minimum = Nbr[i];
   return Minimum;
}
double Max(const double *Nbr, const int Total) {
   double Maximum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Maximum < Nbr[i])
         Maximum = Nbr[i];
   return Maximum;
}
double Sum(const double *Nbr, const int Total) {
   double S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   return S;
}
double Average(const double *Nbr, const int Total) {
   double avg, S = 0;
   for (int i = 0; i < Total; i++)
       S += Nbr[i];
   avg = S / Total;
   return avg;
}
long GreatestCommonDivisor(long Nbr1, long Nbr2) {
   while (true) {
      Nbr1 = Nbr1 % Nbr2;
      if (Nbr1 == 0)
         return Nbr2;
      Nbr2 = Nbr2 % Nbr1;
      if (Nbr2 == 0)
         return Nbr1;
   }
}

Step 9 - Construisez cette bibliothèque à partir du menu principal, en cliquant sur Build → Build MFCLib.

Step 10 - Lorsque la bibliothèque est construite avec succès, elle affichera le message ci-dessus.

Step 11 - Pour utiliser ces fonctions de la bibliothèque, ajoutons une autre application de dialogue MFC basée sur Fichier → Nouveau → Projet.

Step 12 - Accédez au dossier MFCLib \ Debug et copiez le fichier d'en-tête et les fichiers * .lib dans le projet MFCLibTest comme illustré dans l'instantané suivant.

Step 13 - Pour ajouter la bibliothèque au projet en cours, dans le menu principal, cliquez sur Projet → Ajouter un élément existant et sélectionnez MFCLib.lib.

Step 14 - Concevez votre boîte de dialogue comme indiqué dans l'instantané suivant.

Step 15 - Ajouter une variable de valeur pour les deux contrôles d'édition de type valeur double.

Step 16 - Ajouter une variable de valeur pour le contrôle de texte statique, qui se trouve à la fin de la boîte de dialogue.

Step 17 - Ajoutez le gestionnaire d'événements pour le bouton Calculer.

Pour ajouter des fonctionnalités à partir de la bibliothèque, nous devons inclure le fichier d'en-tête dans le fichier CMFCLibTestDlg.cpp.

#include "stdafx.h"
#include "MFCLibTest.h"
#include "MFCLibTestDlg.h"
#include "afxdialogex.h"
#include "Calculator.h"

Step 18 - Voici l'implémentation du gestionnaire d'événements de bouton.

void CMFCLibTestDlg::OnBnClickedButtonCal() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   CString strTemp;
   double numbers[2];
   numbers[0] = m_Num1;
   numbers[1] = m_Num2;

   strTemp.Format(L"%.2f", Max(numbers,2));
   m_strText.Append(L"Max is:\t" + strTemp);

   strTemp.Format(L"%.2f", Min(numbers, 2));
   m_strText.Append(L"\nMin is:\t" + strTemp);
   
   strTemp.Format(L"%.2f", Sum(numbers, 2));
   m_strText.Append(L"\nSum is:\t" + strTemp);

   strTemp.Format(L"%.2f", Average(numbers, 2));
   m_strText.Append(L"\nAverage is:\t" + strTemp);

   strTemp.Format(L"%d", GreatestCommonDivisor(m_Num1, m_Num2));
   m_strText.Append(L"\nGDC is:\t" + strTemp);

   UpdateData(FALSE);
}

Step 19 - Lorsque le code ci-dessus est compilé et exécuté, vous verrez la sortie suivante.

Step 20- Entrez deux valeurs dans le champ d'édition et cliquez sur Calculer. Vous verrez maintenant le résultat après avoir calculé à partir de la bibliothèque.

Bibliothèque dynamique

Une DLL Win32 est une bibliothèque qui peut être mise à la disposition des programmes qui s'exécutent sur un ordinateur Microsoft Windows. En tant que bibliothèque normale, elle est constituée de fonctions et / ou d'autres ressources regroupées dans un fichier.

L'abréviation DLL signifie Dynamic Link Library. Cela signifie que, contrairement à une bibliothèque statique, une DLL permet au programmeur de décider quand et comment d'autres applications seront liées à ce type de bibliothèque.

Par exemple, une DLL permet aux applications différentes d'utiliser sa bibliothèque comme bon leur semble et si nécessaire. En fait, les applications créées sur différents environnements de programmation peuvent utiliser des fonctions ou des ressources stockées dans une DLL particulière. Pour cette raison, une application se lie dynamiquement à la bibliothèque.

Step 1 - Regardons un exemple simple en créant un nouveau projet Win32.

Step 2 - Dans la section Type d'application, cliquez sur le bouton radio DLL.

Step 3 - Cliquez sur Terminer pour continuer.

Step 4 - Ajoutez les fonctions suivantes dans le fichier MFCDynamicLib.cpp et exposez ses définitions en utilisant -

extern "C" _declspec(dllexport)

Step 5 - Utilisez le modificateur _declspec (dllexport) pour chaque fonction qui sera accessible en dehors de la DLL.

// MFCDynamicLib.cpp : Defines the exported functions for the DLL application.//

#include "stdafx.h"

extern "C" _declspec(dllexport) double Min(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Max(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Sum(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) double Average(const double *Numbers, const int Count);
extern "C" _declspec(dllexport) long GreatestCommonDivisor(long Nbr1, long Nbr2);

double Min(const double *Nbr, const int Total) {
   double Minimum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Minimum > Nbr[i])
         Minimum = Nbr[i];
   return Minimum;
}
double Max(const double *Nbr, const int Total) {
   double Maximum = Nbr[0];
   for (int i = 0; i < Total; i++)
      if (Maximum < Nbr[i])
         Maximum = Nbr[i];
   return Maximum;
}
double Sum(const double *Nbr, const int Total) {
   double S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   return S;
}
double Average(const double *Nbr, const int Total){
   double avg, S = 0;
   for (int i = 0; i < Total; i++)
      S += Nbr[i];
   avg = S / Total;
   return avg;
}
long GreatestCommonDivisor(long Nbr1, long Nbr2) {
   while (true) {
      Nbr1 = Nbr1 % Nbr2;
      if (Nbr1 == 0)
         return Nbr2;
      Nbr2 = Nbr2 % Nbr1;
      if (Nbr2 == 0)
         return Nbr1;
   }
}

Step 6 - Pour créer la DLL, dans le menu principal, cliquez sur Build > Build MFCDynamicLib depuis le menu principal.

Step 7 - Une fois la DLL créée avec succès, un message s'affiche dans la fenêtre de sortie.

Step 8 - Ouvrez l'Explorateur Windows puis le dossier Debug du projet en cours.

Step 9 - Notez qu'un fichier avec l'extension dll et un autre fichier avec l'extension lib ont été créés.

Step 10 - Pour tester ce fichier avec l'extension dll, nous devons créer une nouvelle application basée sur une boîte de dialogue MFC à partir de Fichier → Nouveau → Projet.

Step 11 - Accédez au dossier MFCDynamicLib \ Debug et copiez les fichiers * .dll et * .lib dans le projet MFCLibTest comme illustré dans l'instantané suivant.

Step 12 - Pour ajouter la DLL au projet en cours, dans le menu principal, cliquez sur Projet → Ajouter un élément existant, puis sélectionnez le fichier MFCDynamicLib.lib.

Step 13 - Concevez votre boîte de dialogue comme indiqué dans l'instantané suivant.

Step 14 - Ajouter une variable de valeur pour les deux contrôles d'édition de type valeur double.

Step 15 - Ajouter une variable de valeur pour le contrôle de texte statique, qui se trouve à la fin de la boîte de dialogue.

Step 16 - Ajoutez le gestionnaire d'événements pour le bouton Calculer.

Step 17 - Dans le projet qui utilise la DLL, chaque fonction qui sera accédée doit être déclarée à l'aide du modificateur _declspec (dllimport).

Step 18 - Ajoutez la déclaration de fonction suivante dans le fichier MFCLibTestDlg.cpp.

extern "C" _declspec(dllimport) double Min(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Max(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Sum(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) double Average(const double *Numbers, const int Count);
extern "C" _declspec(dllimport) long GreatestCommonDivisor(long Nbr1, long Nbr2);

Step 19 - Voici l'implémentation du gestionnaire d'événements de bouton.

void CMFCLibTestDlg::OnBnClickedButtonCal() {

   // TODO: Add your control notification handler code here
   UpdateData(TRUE);

   CString strTemp;
   double numbers[2];
   numbers[0] = m_Num1;
   numbers[1] = m_Num2;

   strTemp.Format(L"%.2f", Max(numbers,2));
   m_strText.Append(L"Max is:\t" + strTemp);

   strTemp.Format(L"%.2f", Min(numbers, 2));
   m_strText.Append(L"\nMin is:\t" + strTemp);

   strTemp.Format(L"%.2f", Sum(numbers, 2));
   m_strText.Append(L"\nSum is:\t" + strTemp);

   strTemp.Format(L"%.2f", Average(numbers, 2));
   m_strText.Append(L"\nAverage is:\t" + strTemp);

   strTemp.Format(L"%d", GreatestCommonDivisor(m_Num1, m_Num2));
   m_strText.Append(L"\nGDC is:\t" + strTemp);
 
   UpdateData(FALSE);
}

Step 20 - Lorsque le code ci-dessus est compilé et exécuté, vous verrez la sortie suivante.

Step 21- Entrez deux valeurs dans le champ d'édition et cliquez sur Calculer. Vous verrez maintenant le résultat après avoir calculé à partir de la DLL.