Учебники

МФЦ — Библиотеки

Библиотека — это группа функций, классов или других ресурсов, которые можно сделать доступными для программ, которым требуются уже реализованные объекты, без необходимости знать, как были созданы эти функции, классы или ресурсы или как они функционируют. Библиотека облегчает программисту использование функций, классов, ресурсов и т. Д., Созданных другим человеком или компанией, и верит, что этот внешний источник надежен и эффективен. Некоторые уникальные особенности, связанные с библиотеками:

  • Библиотека создается и функционирует как обычная обычная программа, используя функции или другие ресурсы и взаимодействуя с другими программами.

  • Для реализации своих функций библиотека содержит функции, которые необходимы другим программам для завершения их функций.

  • В то же время библиотека может использовать некоторые функции, которые не нужны другим программам.

  • Программы, использующие библиотеку, также называются клиентами библиотеки.

Библиотека создается и функционирует как обычная обычная программа, используя функции или другие ресурсы и взаимодействуя с другими программами.

Для реализации своих функций библиотека содержит функции, которые необходимы другим программам для завершения их функций.

В то же время библиотека может использовать некоторые функции, которые не нужны другим программам.

Программы, использующие библиотеку, также называются клиентами библиотеки.

Существует два типа функций, которые вы будете создавать или включать в свои библиотеки:

  • Внутренняя функция — это функция, используемая только самой библиотекой, и клиентам библиотеки не потребуется доступ к этим функциям.

  • Внешние функции — это те, к которым могут обращаться клиенты библиотеки.

Внутренняя функция — это функция, используемая только самой библиотекой, и клиентам библиотеки не потребуется доступ к этим функциям.

Внешние функции — это те, к которым могут обращаться клиенты библиотеки.

Есть две широкие категории библиотек, с которыми вы будете иметь дело в своих программах:

  • Статические библиотеки
  • Динамические библиотеки

Статическая библиотека

Статическая библиотека — это файл, содержащий функции, классы или ресурсы, которые внешняя программа может использовать для дополнения своих функций. Чтобы использовать библиотеку, программист должен создать ссылку на нее. Проект может быть консольным приложением, приложением Win32 или MFC. Файл библиотеки имеет расширение lib.

Шаг 1 — Давайте рассмотрим простой пример статической библиотеки, создав новый проект Win32.

Статическая библиотека

Шаг 2 — В диалоговом окне «Мастер приложений» выберите параметр «Статическая библиотека».

Статическая библиотека

Шаг 3 — Нажмите Готово, чтобы продолжить.

Статическая библиотека

Шаг 4 — Щелкните правой кнопкой мыши проект в обозревателе решений и добавьте файл заголовка из пункта меню Добавить → Новый элемент….

Статическая библиотека

Шаг 5 — Введите Calculator.h в поле Имя и нажмите Добавить.

Добавьте следующий код в заголовочный файл —

#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_

Шаг 6 — Добавьте исходный (* .cpp) файл в проект.

Статическая библиотека

Шаг 7 — Введите Calculator.cpp в поле Имя и нажмите Добавить.

Шаг 8 — Добавьте следующий код в файл * .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;
   }
}

Шаг 9 — Создайте эту библиотеку из главного меню, нажав Build → Build MFCLib .

Статическая библиотека

Шаг 10 — Когда библиотека будет успешно построена, на ней появится вышеуказанное сообщение.

Шаг 11 — Чтобы использовать эти функции из библиотеки, давайте добавим еще одно диалоговое приложение MFC на основе Файл → Создать → Проект.

Статическая библиотека

Шаг 12. Перейдите в папку MFCLib \ Debug и скопируйте файл заголовка и файлы * .lib в проект MFCLibTest, как показано на следующем снимке.

Статическая библиотека

Шаг 13 — Чтобы добавить библиотеку в текущий проект, в главном меню выберите «Проект» → «Добавить существующий элемент» и выберите «MFCLib.lib».

Шаг 14 — Создайте диалоговое окно, как показано на следующем снимке.

Статическая библиотека

Шаг 15 — Добавьте переменную значения для обоих элементов управления редактирования типа значения double.

Статическая библиотека

Шаг 16 — Добавьте переменную значения для статического текстового элемента управления, который находится в конце диалогового окна.

Статическая библиотека

Шаг 17 — Добавьте обработчик события для кнопки «Рассчитать».

Чтобы добавить функциональность из библиотеки, нам нужно включить файл заголовка в файл CMFCLibTestDlg.cpp.

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

Шаг 18 — Вот реализация обработчика события кнопки.

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);
}

Шаг 19 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Статическая библиотека

Шаг 20 — Введите два значения в поле редактирования и нажмите «Рассчитать». Теперь вы увидите результат после расчета из библиотеки.

Статическая библиотека

Динамическая библиотека

Win32 DLL — это библиотека, которую можно сделать доступной для программ, работающих на компьютере под управлением Microsoft Windows. Как обычная библиотека, она состоит из функций и / или других ресурсов, сгруппированных в файле.

Аббревиатура DLL расшифровывается как Dynamic Link Library. Это означает, что в отличие от статической библиотеки, DLL позволяет программисту решать, когда и как другие приложения будут связаны с библиотекой этого типа.

Например, DLL позволяет разным приложениям использовать свою библиотеку по своему усмотрению и по мере необходимости. Фактически, приложения, созданные в разных средах программирования, могут использовать функции или ресурсы, хранящиеся в одной конкретной DLL. По этой причине приложение динамически связывается с библиотекой.

Шаг 1 — Давайте рассмотрим простой пример, создав новый проект Win32.

Динамическая библиотека

Шаг 2 — В разделе «Тип приложения» щелкните переключатель DLL.

Динамическая библиотека

Шаг 3 — Нажмите Готово, чтобы продолжить.

Шаг 4 — Добавьте следующие функции в файл MFCDynamicLib.cpp и предоставьте его определения, используя —

extern "C" _declspec(dllexport)

Шаг 5 — Используйте модификатор _declspec (dllexport) для каждой функции, к которой будет обращаться за пределами 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;
   }
}

Шаг 6 — Чтобы создать DLL, в главном меню выберите Build> Build MFCDynamicLib из главного меню.

Динамическая библиотека

Шаг 7 — После того, как DLL успешно создана, вы увидите отображение сообщения в окне вывода.

Шаг 8 — Откройте проводник Windows, а затем папку «Отладка» текущего проекта.

Шаг 9 — Обратите внимание, что был создан файл с расширением dll и другой файл с расширением lib.

Динамическая библиотека

Шаг 10 — Чтобы протестировать этот файл с расширением dll, нам нужно создать новое диалоговое приложение MFC из меню Файл → Создать → Проект.

Динамическая библиотека

Шаг 11 — Перейдите в папку MFCDynamicLib \ Debug и скопируйте файлы * .dll и * .lib в проект MFCLibTest, как показано на следующем снимке.

Динамическая библиотека

Шаг 12 — Чтобы добавить DLL в текущий проект, в главном меню выберите «Проект» → «Добавить существующий элемент», а затем выберите файл MFCDynamicLib.lib.

Шаг 13 — Создайте диалоговое окно, как показано на следующем снимке.

Динамическая библиотека

Шаг 14 — Добавьте переменную значения для обоих элементов управления редактирования типа значения double.

Динамическая библиотека

Шаг 15 — Добавьте переменную значения для статического текстового элемента управления, который находится в конце диалогового окна.

Динамическая библиотека

Шаг 16 — Добавьте обработчик события для кнопки «Рассчитать».

Шаг 17 — В проекте, использующем DLL, каждая функция, к которой будет осуществляться доступ, должна быть объявлена ​​с использованием модификатора _declspec (dllimport).

Шаг 18 — Добавьте следующее объявление функции в файл 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);

Шаг 19 — Вот реализация обработчика события кнопки.

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);
}

Шаг 20 — Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод.

Динамическая библиотека

Шаг 21 — Введите два значения в поле редактирования и нажмите «Рассчитать». Теперь вы увидите результат после расчета из DLL.