MFC - Bibliotecas

UMA libraryé um grupo de funções, classes ou outros recursos que podem ser disponibilizados para programas que precisam de entidades já implementadas sem a necessidade de saber como essas funções, classes ou recursos foram criados ou como funcionam. Uma biblioteca torna mais fácil para um programador usar funções, classes e recursos etc. criados por outra pessoa ou empresa e confiar que essa fonte externa é confiável e eficiente. Alguns recursos exclusivos relacionados a bibliotecas são -

  • Uma biblioteca é criada e funciona como um programa normal normal, usando funções ou outros recursos e comunicando-se com outros programas.

  • Para implementar sua funcionalidade, uma biblioteca contém funções que outros programas precisariam para completar sua funcionalidade.

  • Ao mesmo tempo, uma biblioteca pode usar algumas funções que outros programas não precisariam.

  • Os programas que utilizam a biblioteca, também são chamados de clientes da biblioteca.

Existem dois tipos de funções que você criará ou incluirá em suas bibliotecas -

  • Uma função interna é usada apenas pela própria biblioteca e os clientes da biblioteca não precisarão acessar essas funções.

  • Funções externas são aquelas que podem ser acessadas pelos clientes da biblioteca.

Existem duas grandes categorias de bibliotecas com as quais você lidará em seus programas -

  • Bibliotecas estáticas
  • Bibliotecas dinâmicas

Biblioteca Estática

UMA static libraryé um arquivo que contém funções, classes ou recursos que um programa externo pode usar para complementar sua funcionalidade. Para usar uma biblioteca, o programador deve criar um link para ela. O projeto pode ser um aplicativo de console, um Win32 ou um aplicativo MFC. O arquivo de biblioteca possui a extensão lib.

Step 1 - Vejamos um exemplo simples de biblioteca estática criando um novo projeto Win32.

Step 2 - Na caixa de diálogo Application Wizard, escolha a opção Static Library.

Step 3 - Clique em Concluir para continuar.

Step 4 - Clique com o botão direito do mouse no projeto no Solution Explorer e adicione um arquivo de cabeçalho da opção de menu Adicionar → Novo Item….

Step 5 - Digite Calculator.h no campo Nome e clique em Adicionar.

Adicione o seguinte código no arquivo de cabeçalho -

#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 - Adicione um arquivo de origem (* .cpp) no projeto.

Step 7 - Digite Calculator.cpp no ​​campo Nome e clique em Adicionar.

Step 8 - Adicione o seguinte código no arquivo * .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 - Construa esta biblioteca a partir do menu principal, clicando em Build → Build MFCLib.

Step 10 - Quando a biblioteca for construída com sucesso, ela exibirá a mensagem acima.

Step 11 - Para usar essas funções da biblioteca, vamos adicionar outro aplicativo de diálogo MFC baseado em Arquivo → Novo → Projeto.

Step 12 - Vá para a pasta MFCLib \ Debug e copie o arquivo de cabeçalho e os arquivos * .lib para o projeto MFCLibTest, conforme mostrado no instantâneo a seguir.

Step 13 - Para adicionar a biblioteca ao projeto atual, no menu principal, clique em Projeto → Adicionar item existente e selecione MFCLib.lib.

Step 14 - Projete sua caixa de diálogo conforme mostrado no instantâneo a seguir.

Step 15 - Adicionar variável de valor para ambos os controles de edição do tipo de valor duplo.

Step 16 - Adicione a variável de valor para o controle de texto estático, que está no final da caixa de diálogo.

Step 17 - Adicione o manipulador de eventos para o botão Calcular.

Para adicionar funcionalidade da biblioteca, precisamos incluir o arquivo de cabeçalho no arquivo CMFCLibTestDlg.cpp.

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

Step 18 - Aqui está a implementação do manipulador de eventos de botão.

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 - Quando o código acima for compilado e executado, você verá a seguinte saída.

Step 20- Insira dois valores no campo de edição e clique em Calcular. Agora você verá o resultado depois de calcular da biblioteca.

Biblioteca Dinâmica

Uma DLL Win32 é uma biblioteca que pode ser disponibilizada para programas executados em um computador Microsoft Windows. Como uma biblioteca normal, é composta por funções e / ou outros recursos agrupados em um arquivo.

A abreviatura DLL significa Dynamic Link Library. Isso significa que, ao contrário de uma biblioteca estática, uma DLL permite ao programador decidir quando e como outros aplicativos serão vinculados a esse tipo de biblioteca.

Por exemplo, uma DLL permite que aplicativos diferentes usem sua biblioteca da maneira que acharem conveniente e conforme necessário. Na verdade, os aplicativos criados em diferentes ambientes de programação podem usar funções ou recursos armazenados em uma DLL específica. Por esse motivo, um aplicativo se vincula dinamicamente à biblioteca.

Step 1 - Vejamos um exemplo simples criando um novo projeto Win32.

Step 2 - Na seção Tipo de aplicativo, clique no botão de opção DLL.

Step 3 - Clique em Concluir para continuar.

Step 4 - Adicione as seguintes funções no arquivo MFCDynamicLib.cpp e exponha suas definições usando -

extern "C" _declspec(dllexport)

Step 5 - Use o modificador _declspec (dllexport) para cada função que será acessada fora da 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 criar a DLL, no menu principal, clique em Build > Build MFCDynamicLib no menu principal.

Step 7 - Depois que a DLL for criada com sucesso, você verá uma mensagem exibida na janela de saída.

Step 8 - Abra o Windows Explorer e, a seguir, a pasta Debug do projeto atual.

Step 9 - Observe que um arquivo com extensão dll e outro arquivo com extensão lib foram criados.

Step 10 - Para testar este arquivo com extensão dll, precisamos criar um novo aplicativo baseado no diálogo MFC em Arquivo → Novo → Projeto.

Step 11 - Vá para a pasta MFCDynamicLib \ Debug e copie os arquivos * .dll e * .lib para o projeto MFCLibTest conforme mostrado no instantâneo a seguir.

Step 12 - Para adicionar a DLL ao projeto atual, no menu principal, clique em Projeto → Adicionar Item Existente e selecione o arquivo MFCDynamicLib.lib.

Step 13 - Projete sua caixa de diálogo conforme mostrado no instantâneo a seguir.

Step 14 - Adicionar variável de valor para ambos os controles de edição do tipo de valor duplo.

Step 15 - Adicione a variável de valor para o controle de texto estático, que está no final da caixa de diálogo.

Step 16 - Adicione o manipulador de eventos para o botão Calcular.

Step 17 - No projeto que está utilizando a DLL, cada função que será acessada deve ser declarada utilizando o modificador _declspec (dllimport).

Step 18 - Adicione a seguinte declaração de função no arquivo 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 - Aqui está a implementação do manipulador de eventos de botão.

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 - Quando o código acima for compilado e executado, você verá a seguinte saída.

Step 21- Insira dois valores no campo de edição e clique em Calcular. Agora você verá o resultado após o cálculo da DLL.