MFC - Bibliotecas

UN libraryes un grupo de funciones, clases u otros recursos que se pueden poner a disposición de los programas que necesitan entidades ya implementadas sin la necesidad de saber cómo se crearon estas funciones, clases o recursos o cómo funcionan. Una biblioteca facilita al programador el uso de funciones, clases, recursos, etc. creados por otra persona o empresa y confía en que esta fuente externa es confiable y eficiente. Algunas características únicas relacionadas con las bibliotecas son:

  • Una biblioteca se crea y funciona como un programa regular normal, usando funciones u otros recursos y comunicándose con otros programas.

  • Para implementar su funcionalidad, una biblioteca contiene funciones que otros programas necesitarían para completar su funcionalidad.

  • Al mismo tiempo, una biblioteca puede usar algunas funciones que otros programas no necesitarían.

  • Los programas que utilizan la biblioteca también se denominan clientes de la biblioteca.

Hay dos tipos de funciones que creará o incluirá en sus bibliotecas:

  • Una función interna es aquella que solo utiliza la biblioteca y los clientes de la biblioteca no necesitarán acceder a estas funciones.

  • Las funciones externas son aquellas a las que pueden acceder los clientes de la biblioteca.

Hay dos categorías amplias de bibliotecas con las que tratará en sus programas:

  • Bibliotecas estáticas
  • Bibliotecas dinámicas

Biblioteca estática

UN static libraryes un archivo que contiene funciones, clases o recursos que un programa externo puede utilizar para complementar su funcionalidad. Para usar una biblioteca, el programador debe crear un enlace a ella. El proyecto puede ser una aplicación de consola, Win32 o una aplicación MFC. El archivo de la biblioteca tiene la extensión lib.

Step 1 - Veamos un ejemplo simple de biblioteca estática creando un nuevo proyecto Win32.

Step 2 - En el cuadro de diálogo Asistente para aplicaciones, elija la opción Biblioteca estática.

Step 3 - Haga clic en Finalizar para continuar.

Step 4 - Haga clic con el botón derecho en el proyecto en el explorador de soluciones y agregue un archivo de encabezado desde la opción de menú Agregar → Nuevo elemento ...

Step 5 - Ingrese Calculator.h en el campo Nombre y haga clic en Agregar.

Agregue el siguiente código en el archivo de encabezado:

#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 - Agregue un archivo fuente (* .cpp) en el proyecto.

Step 7 - Ingrese Calculator.cpp en el campo Nombre y haga clic en Agregar.

Step 8 - Agregue el siguiente código en el archivo * .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 - Cree esta biblioteca desde el menú principal, haciendo clic en Build → Build MFCLib.

Step 10 - Cuando la biblioteca se construye correctamente, mostrará el mensaje anterior.

Step 11 - Para usar estas funciones de la biblioteca, agreguemos otra aplicación de diálogo MFC basada en Archivo → Nuevo → Proyecto.

Step 12 - Vaya a la carpeta MFCLib \ Debug y copie el archivo de encabezado y los archivos * .lib al proyecto MFCLibTest como se muestra en la siguiente instantánea.

Step 13 - Para agregar la biblioteca al proyecto actual, en el menú principal, haga clic en Proyecto → Agregar elemento existente y seleccione MFCLib.lib.

Step 14 - Diseñe su cuadro de diálogo como se muestra en la siguiente instantánea.

Step 15 - Agregar variable de valor para ambos controles de edición de tipo de valor doble.

Step 16 - Agregar variable de valor para el control de texto estático, que se encuentra al final del cuadro de diálogo.

Step 17 - Agregue el controlador de eventos para el botón Calcular.

Para agregar funcionalidad desde la biblioteca, necesitamos incluir el archivo de encabezado en el archivo CMFCLibTestDlg.cpp.

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

Step 18 - Aquí está la implementación del controlador de eventos de botón.

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 - Cuando se compile y ejecute el código anterior, verá el siguiente resultado.

Step 20- Introduzca dos valores en el campo de edición y haga clic en Calcular. Ahora verá el resultado después de calcular desde la biblioteca.

Biblioteca dinámica

Una DLL de Win32 es una biblioteca que puede estar disponible para programas que se ejecutan en una computadora con Microsoft Windows. Como una biblioteca normal, está formada por funciones y / u otros recursos agrupados en un archivo.

La abreviatura de DLL significa Dynamic Link Library. Esto significa que, a diferencia de una biblioteca estática, una DLL permite al programador decidir cuándo y cómo se vincularán otras aplicaciones a este tipo de biblioteca.

Por ejemplo, una DLL permite que las distintas aplicaciones utilicen su biblioteca como mejor les parezca y según sea necesario. De hecho, las aplicaciones creadas en diferentes entornos de programación pueden utilizar funciones o recursos almacenados en una DLL en particular. Por esta razón, una aplicación se vincula dinámicamente a la biblioteca.

Step 1 - Veamos un ejemplo simple creando un nuevo Proyecto Win32.

Step 2 - En la sección Tipo de aplicación, haga clic en el botón de opción DLL.

Step 3 - Haga clic en Finalizar para continuar.

Step 4 - Agregue las siguientes funciones en el archivo MFCDynamicLib.cpp y exponga sus definiciones usando -

extern "C" _declspec(dllexport)

Step 5 - Utilice el modificador _declspec (dllexport) para cada función a la que se accederá fuera 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 - Para crear la DLL, en el menú principal, haga clic en Build > Build MFCDynamicLib desde el menú principal.

Step 7 - Una vez que la DLL se haya creado correctamente, verá una pantalla de mensaje en la ventana de salida.

Step 8 - Abra el Explorador de Windows y luego la carpeta Debug del proyecto actual.

Step 9 - Observe que se ha creado un archivo con extensión dll y otro archivo con extensión lib.

Step 10 - Para probar este archivo con la extensión dll, necesitamos crear una nueva aplicación basada en el diálogo MFC desde Archivo → Nuevo → Proyecto.

Step 11 - Vaya a la carpeta MFCDynamicLib \ Debug y copie los archivos * .dll y * .lib al proyecto MFCLibTest como se muestra en la siguiente instantánea.

Step 12 - Para agregar la DLL al proyecto actual, en el menú principal, haga clic en Proyecto → Agregar elemento existente y luego seleccione el archivo MFCDynamicLib.lib.

Step 13 - Diseñe su cuadro de diálogo como se muestra en la siguiente instantánea.

Step 14 - Agregar variable de valor para ambos controles de edición de tipo de valor doble.

Step 15 - Agregar variable de valor para el control de texto estático, que se encuentra al final del cuadro de diálogo.

Step 16 - Agregue el controlador de eventos para el botón Calcular.

Step 17 - En el proyecto que está usando la DLL, cada función a la que se accederá debe declararse usando el modificador _declspec (dllimport).

Step 18 - Agregue la siguiente declaración de función en el archivo 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 - Aquí está la implementación del controlador de eventos de botón.

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 - Cuando se compile y ejecute el código anterior, verá el siguiente resultado.

Step 21- Introduzca dos valores en el campo de edición y haga clic en Calcular. Ahora verá el resultado después de calcular desde la DLL.