Лабораторная работа знакомит с методикой создания откомпилированных модулей программного обеспечения, готовых для подключения другими программистами в свои приложения. При этом компилируется только реализация функций или классов, которая находится в файлах с расширением .cpp.
Продукт, который выпускает программист - это может быть не только законченное приложение, а хорошо сконструированный и отлаженный программный модуль, способный решать определенную задачу в рамках приложения, разработанного другим программистом. Здесь нужно определиться с терминологией в данной лабораторной работе:
LibLib -библиотеки при разработке своих приложенийСуществует несколько причин, по которым возникает необходимость распространять свои программные наработки не в открытом исходном коде, а в откомпилированном виде:
Вынесение части программного кода в самостоятельные модули-полуфабрикаты называется
DLL (Dynamic-Link Library ) - динамически загружаемые библиотекиActiveX. Они хранятся в файлах, имеющих расширение OCX Lib (Library) - статическая библиотека Win32Поставщик программного модуля любого типа должен позаботиться о сопроводительной документации к распространяемому модулю. Включаемые заголовочные файлы для Lib -модуля также должны распространяться в открытом виде, чтобы пользователь имел возможность сообщить компилятору о спецификации Lib -кода, используемого в приложении и подключаемого позже линковщиком.
Рассмотрим создание Lib -модуля на простом примере моделирования круга. Для этого создадим свой класс круга, в котором предусмотрим минимальные возможности. Затем упакуем созданный код в Lib -библиотеку и построим тестовое приложение для проверки возможности подключения готового модуля круга.
Перейдите в свой каталог выполнения лабораторной работы
Выберите команды меню по созданию нового проекта
Назовите проект
После нажатия кнопки
После создания мастером заготовки приложения установите режим На этом создание заготовки проекта CircleLib закончено. Обратите внимание на файл ресурсов. В нем ничего не содержится. Это правильно, поскольку весь остальной код программного модуля предстоит разработать самому программисту.

Далее мы создадим файлы Circle.cpp и Circle.h, в которых будет размещен программный код моделирования круга и из которых в дальнейшем создадим библиотечный файл.
Выполните команду меню по добавлению в проект нового cpp-файла
В окне мастера выберите настройку создания cpp-файла и задайте его имя
Щелкните по кнопке
В текстовом редакторе созданного файла добавьте вначале пустого пока файла следующий кодСлужебный заголовок к файлу Circle.cpp реализации класса CCircle ///////////////////////////////////////////////////////// // Circle.cpp // Copyright (C), разработал программист (студент) ФИО // Этот файл содержит реализацию класса CCircle // и используется для генерации библиотечного файла /////////////////////////////////////////////////////////
Аналогичным образом создайте файл
В созданном файле Circle.h внесите служебную информацию о создателе будущего библиотечного файлаВнося свою информацию, имейте ввиду, что этот файл будет распространяться в исходном виде и помещать в него информацию с номером своей кредитной карточки или сумме на лицевом счете лучше не надо.
Служебный заголовок к файлу Circle.h спецификации класса CCircle ///////////////////////////////////////////////////////// // Circle.h // Copyright (C), разработал программист (студент) ФИО // Этот файл содержит спецификацию класса CCircle // и используется для генерации библиотечного файла // Распространяется вместе с библиотекой /////////////////////////////////////////////////////////
Сохраните изменения в обеих файлах на дискеТеперь файлы Circle.cpp и Circle.h являются частью проекта.
Создадим очень простой класс, который будет хранить переменную радиуса круга и несколько сервисов, позволяющих задать значение переменной, вернуть пользователю значение переменной, вычислить и вернуть значение площади круга. Создадим также конструктор с параметром радиуса по умолчанию и пустой деструктор.
Внесите в файл спецификации Circle.h и в Circle.cpp следующий кодФайл Circle.h спецификации класса CCircle
/////////////////////////////////////////////////////////
// Circle.h
// Copyright (C), разработал программист (студент) ФИО
// Этот файл содержит спецификацию класса CCircle
// и используется для генерации библиотечного файла
// Распространяется вместе с библиотекой
/////////////////////////////////////////////////////////
#pragma once
#include // MFC core and standard components
class CCircle
{
private:
int m_radius;
public: // Конструктор/Деструктор
CCircle(int r = 5){ m_radius = r;}
~CCircle(){}
public:
// Сервисы класса
void SetRadius(int);
int GetRadius();
float GetArea();
void DisplayArea();
};
Файл Circle.cpp реализации класса CCircle
/////////////////////////////////////////////////////////
// Circle.cpp
// Copyright (C), разработал программист (студент) ФИО
// Этот файл содержит реализацию класса CCircle
// и используется для генерации библиотечного файла
/////////////////////////////////////////////////////////
#include "Circle.h"
// Реализация сервисов класса CCircle
void CCircle::SetRadius(int r)
{
m_radius = r;
}
int CCircle::GetRadius()
{
return m_radius;
}
float CCircle::GetArea() // Секретная формула
{
return (float)3.1415926538 * (float)m_radius * (float)m_radius;
}
void CCircle::DisplayArea()
{
float fArea = GetArea();
CString str;
str.Format("Площадь круга равна: %f", fArea);
AfxMessageBox(str);
}
Постройте проект, выполнив команду Build Solution или Build Circle из меню Build оболочки
Войдите в каталог Release и убедитесь, что там создался файл Circle.libДля проверки рассматриваемой технологии создадим простое тестовое приложение, которое по нажатию кнопок будет вычислять и выдавать информацию о площади круга по введенному радиусу. При этом программная поддержка модели круга будет находиться в созданной нами библиотеки Circle.lib.
Закройте проект создания библиотеки и, оставаясь в том же каталоге выполнения лабораторной работы, создайте новый проект с именем TestLib
Выполните команду меню оболочки
Заполните вкладки мастера создания проекта так


После нажатия на кнопке
Установите режим построения тестового приложения в Release
Откройте в режиме дизайна (визуального проектирования) ресурс
IDIDD_TESTLIB_DIALOGCaptionТест для LibButtonIDIDC_BUTTON_EXITCaptionGroup Box CaptionStatic Text IDIDC_STATICCaptionAlign Text RightStatic TextIDIDC_STATICCaptionAlign Text RightButtonIDIDC_BUTTON_EXECUTECaptionButtonIDIDC_BUTTON_DISPLAYCaptionEdit Control IDIDC_EDIT_RADIUSWidthEdit Control IDIDC_EDIT_AREAWidth
Оформите интерфейс пользователя так, как показано на рисунке
В тестовом приложении мы будем использовать класс CCircle и его реализацию. Описание класса хранится в файле Circle.h, а объектный код функций-членов хранится в библиотеке Circle.lib. На этапе компиляции тестового приложения компилятору достаточно информации об описании класса CCircle, поэтому требуется только поместить вначале файла TestLibDlg.cpp директиву #include "path\\Circle.h".
Здесь path указывает место размещения файла Circle.h в дереве каталогов. Двойной обратный слеш ставится потому, что одинарный слэш в C++ по умолчанию считается экраном и чтобы компилятор правильно его принял, его нужно заэкранировать (экран экранирует экран - мама мыла раму).
Чтобы не связываться с путем, лучше скопировать файл Circle.h в каталог проекта тестового приложения.
Компоновщику тестового приложения нужен объектный код реализации класса CCircle, который содержится в файле Circle.lib. Этот файл тоже необходимо включить в тестовое приложение.
Скопируйте из предыдущего проекта два файла: Circle.h и из каталога Release - файл Circle.lib
Откройте файл TestLibDlg.h и добавьте в начало кодПодключение описания класса CCircle в тестовое приложение
// TestLibDlg.h : header file
//
#pragma once
#include "Circle.h"
// CTestLibDlg dialog
class CTestLibDlg : public CDialog
{
...............................................
};
Теперь описание класса CCircle будет доступно компилятору при построении проекта.
Через меню
В открывшемся окне установите фильтр файлов на Теперь объектный код библиотеки стал частью проекта и будет доступен компоновщику при построении проекта, в чем можно убедиться, открыв дерево файлов проекта
Добавим переменные, которые свяжут элементы управления и код программы и обеспечат обмен значениями того, что на экране и этих переменных.
Выделите элемент
Выделите элемент Для реализации механизма обмена DDX мастер добавит не только описания переменных в класс, но и в функцию DoDataExchange() также добавит код
Код для реализации DDX-механизма обмена
void CTestLibDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_RADIUS, m_iRadius);
DDX_Text(pDX, IDC_EDIT_AREA, m_fArea);
}
Прежде всего нужно создать в классе поддержки диалогового окна приложения CTestLibDlg экземпляр ранее разработанного нами класса CCircle, считая, что он доступен тестовому приложению.
В файле TestLibDlg.h добавьте в конец класса CTestLibDlg следующий кодВключение объекта круга в описание класса диалогового окна
// TestLibDlg.h : header file
//
#pragma once
// CTestLibDlg dialog
class CTestLibDlg : public CDialog
{
..................................................
private:
// Переменная для поля радиуса
int m_iRadius;
// Переменная для поля площади
float m_fArea;
CCircle circle;
};
В метод OnInitDialog() класса CTestLibDlg в самый конец перед оператором return добавьте код инициализацииКод инициализации в файле TestLibDlg.cpp
BOOL CTestLibDlg::OnInitDialog()
{
.......................................................
// TODO: Add extra initialization here
m_iRadius = circle.GetRadius();
m_fArea = circle.GetArea();
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
Постройте проект приложения и убедитесь, что оно работает, но пока не хватает функциональностиДальше мы добавим функциональность к элементам управления, а пока наше тестовое приложение после запуска должно выглядеть так

Обратите внимание, что начальный радиус (5) сгенерирован конструктором класса CCircle со значением параметра по умолчанию, которое мы задали ранее при разработке класса.
В режиме дизайна двойным щелчком по кнопке Выход создайте обработчик и внесите в него код завершения приложенияОбработчик кнопки "Выход"
void CTestLibDlg::OnBnClickedButtonExit()
{
// TODO: Add your control notification handler code here
OnOK();
}
В режиме дизайна двойным щелчком по кнопке Решить создайте обработчик и внесите в него кодОбработчик кнопки "Решить"
void CTestLibDlg::OnBnClickedButtonExecute()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
circle.SetRadius(m_iRadius);
m_fArea = circle.GetArea();
UpdateData(FALSE);
}
В режиме дизайна двойным щелчком по кнопке Показать создайте обработчик и внесите в него кодОбработчик кнопки "Показать"
void CTestLibDlg::OnBnClickedButtonDisplay()
{
// TODO: Add your control notification handler code here
OnBnClickedButtonExecute();
circle.DisplayArea();
}
В последнем обработчике мы задействовали код предыдущего обработчика, чтобы показывать в диалоговом окне свежую информацию.
Постройте приложение и убедитесь в его работоспособности
Смените иконку приложения и оформите Лабораторная работа знакомит с методикой создания откомпилированных модулей программного обеспечения, готовых для подключения другими программистами в свои приложения. При этом компилируется только реализация функций или классов, которая находится в файлах с расширением .cpp.
Продукт, который выпускает программист - это может быть не только законченное приложение, а хорошо сконструированный и отлаженный программный модуль, способный решать определенную задачу в рамках приложения, разработанного другим программистом. Здесь нужно определиться с терминологией в данной лабораторной работе:
LibLib -библиотеки при разработке своих приложенийСуществует несколько причин, по которым возникает необходимость распространять свои программные наработки не в открытом исходном коде, а в откомпилированном виде:
Вынесение части программного кода в самостоятельные модули-полуфабрикаты называется
DLL (Dynamic-Link Library ) - динамически загружаемые библиотекиActiveX. Они хранятся в файлах, имеющих расширение OCX Lib (Library) - статическая библиотека Win32Поставщик программного модуля любого типа должен позаботиться о сопроводительной документации к распространяемому модулю. Включаемые заголовочные файлы для Lib -модуля также должны распространяться в открытом виде, чтобы пользователь имел возможность сообщить компилятору о спецификации Lib -кода, используемого в приложении и подключаемого позже линковщиком.
Рассмотрим создание Lib -модуля на простом примере моделирования круга. Для этого создадим свой класс круга, в котором предусмотрим минимальные возможности. Затем упакуем созданный код в Lib -библиотеку и построим тестовое приложение для проверки возможности подключения готового модуля круга.
Перейдите в свой каталог выполнения лабораторной работы
Выберите команды меню по созданию нового проекта
Назовите проект
После нажатия кнопки
После создания мастером заготовки приложения установите режим На этом создание заготовки проекта CircleLib закончено. Обратите внимание на файл ресурсов. В нем ничего не содержится. Это правильно, поскольку весь остальной код программного модуля предстоит разработать самому программисту.

Далее мы создадим файлы Circle.cpp и Circle.h, в которых будет размещен программный код моделирования круга и из которых в дальнейшем создадим библиотечный файл.
Выполните команду меню по добавлению в проект нового cpp-файла
В окне мастера выберите настройку создания cpp-файла и задайте его имя
Щелкните по кнопке
В текстовом редакторе созданного файла добавьте вначале пустого пока файла следующий кодСлужебный заголовок к файлу Circle.cpp реализации класса CCircle ///////////////////////////////////////////////////////// // Circle.cpp // Copyright (C), разработал программист (студент) ФИО // Этот файл содержит реализацию класса CCircle // и используется для генерации библиотечного файла /////////////////////////////////////////////////////////
Аналогичным образом создайте файл
В созданном файле Circle.h внесите служебную информацию о создателе будущего библиотечного файлаВнося свою информацию, имейте ввиду, что этот файл будет распространяться в исходном виде и помещать в него информацию с номером своей кредитной карточки или сумме на лицевом счете лучше не надо.
Служебный заголовок к файлу Circle.h спецификации класса CCircle ///////////////////////////////////////////////////////// // Circle.h // Copyright (C), разработал программист (студент) ФИО // Этот файл содержит спецификацию класса CCircle // и используется для генерации библиотечного файла // Распространяется вместе с библиотекой /////////////////////////////////////////////////////////
Сохраните изменения в обеих файлах на дискеТеперь файлы Circle.cpp и Circle.h являются частью проекта.
Создадим очень простой класс, который будет хранить переменную радиуса круга и несколько сервисов, позволяющих задать значение переменной, вернуть пользователю значение переменной, вычислить и вернуть значение площади круга. Создадим также конструктор с параметром радиуса по умолчанию и пустой деструктор.
Внесите в файл спецификации Circle.h и в Circle.cpp следующий кодФайл Circle.h спецификации класса CCircle
/////////////////////////////////////////////////////////
// Circle.h
// Copyright (C), разработал программист (студент) ФИО
// Этот файл содержит спецификацию класса CCircle
// и используется для генерации библиотечного файла
// Распространяется вместе с библиотекой
/////////////////////////////////////////////////////////
#pragma once
#include // MFC core and standard components
class CCircle
{
private:
int m_radius;
public: // Конструктор/Деструктор
CCircle(int r = 5){ m_radius = r;}
~CCircle(){}
public:
// Сервисы класса
void SetRadius(int);
int GetRadius();
float GetArea();
void DisplayArea();
};
Файл Circle.cpp реализации класса CCircle
/////////////////////////////////////////////////////////
// Circle.cpp
// Copyright (C), разработал программист (студент) ФИО
// Этот файл содержит реализацию класса CCircle
// и используется для генерации библиотечного файла
/////////////////////////////////////////////////////////
#include "Circle.h"
// Реализация сервисов класса CCircle
void CCircle::SetRadius(int r)
{
m_radius = r;
}
int CCircle::GetRadius()
{
return m_radius;
}
float CCircle::GetArea() // Секретная формула
{
return (float)3.1415926538 * (float)m_radius * (float)m_radius;
}
void CCircle::DisplayArea()
{
float fArea = GetArea();
CString str;
str.Format("Площадь круга равна: %f", fArea);
AfxMessageBox(str);
}
Постройте проект, выполнив команду Build Solution или Build Circle из меню Build оболочки
Войдите в каталог Release и убедитесь, что там создался файл Circle.libДля проверки рассматриваемой технологии создадим простое тестовое приложение, которое по нажатию кнопок будет вычислять и выдавать информацию о площади круга по введенному радиусу. При этом программная поддержка модели круга будет находиться в созданной нами библиотеки Circle.lib.
Закройте проект создания библиотеки и, оставаясь в том же каталоге выполнения лабораторной работы, создайте новый проект с именем TestLib
Выполните команду меню оболочки
Заполните вкладки мастера создания проекта так


После нажатия на кнопке
Установите режим построения тестового приложения в Release
Откройте в режиме дизайна (визуального проектирования) ресурс
IDIDD_TESTLIB_DIALOGCaptionТест для LibButtonIDIDC_BUTTON_EXITCaptionGroup Box CaptionStatic Text IDIDC_STATICCaptionAlign Text RightStatic TextIDIDC_STATICCaptionAlign Text RightButtonIDIDC_BUTTON_EXECUTECaptionButtonIDIDC_BUTTON_DISPLAYCaptionEdit Control IDIDC_EDIT_RADIUSWidthEdit Control IDIDC_EDIT_AREAWidth
Оформите интерфейс пользователя так, как показано на рисунке
В тестовом приложении мы будем использовать класс CCircle и его реализацию. Описание класса хранится в файле Circle.h, а объектный код функций-членов хранится в библиотеке Circle.lib. На этапе компиляции тестового приложения компилятору достаточно информации об описании класса CCircle, поэтому требуется только поместить вначале файла TestLibDlg.cpp директиву #include "path\\Circle.h".
Здесь path указывает место размещения файла Circle.h в дереве каталогов. Двойной обратный слеш ставится потому, что одинарный слэш в C++ по умолчанию считается экраном и чтобы компилятор правильно его принял, его нужно заэкранировать (экран экранирует экран - мама мыла раму).
Чтобы не связываться с путем, лучше скопировать файл Circle.h в каталог проекта тестового приложения.
Компоновщику тестового приложения нужен объектный код реализации класса CCircle, который содержится в файле Circle.lib. Этот файл тоже необходимо включить в тестовое приложение.
Скопируйте из предыдущего проекта два файла: Circle.h и из каталога Release - файл Circle.lib
Откройте файл TestLibDlg.h и добавьте в начало кодПодключение описания класса CCircle в тестовое приложение
// TestLibDlg.h : header file
//
#pragma once
#include "Circle.h"
// CTestLibDlg dialog
class CTestLibDlg : public CDialog
{
...............................................
};
Теперь описание класса CCircle будет доступно компилятору при построении проекта.
Через меню
В открывшемся окне установите фильтр файлов на Теперь объектный код библиотеки стал частью проекта и будет доступен компоновщику при построении проекта, в чем можно убедиться, открыв дерево файлов проекта
Добавим переменные, которые свяжут элементы управления и код программы и обеспечат обмен значениями того, что на экране и этих переменных.
Выделите элемент
Выделите элемент Для реализации механизма обмена DDX мастер добавит не только описания переменных в класс, но и в функцию DoDataExchange() также добавит код
Код для реализации DDX-механизма обмена
void CTestLibDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_RADIUS, m_iRadius);
DDX_Text(pDX, IDC_EDIT_AREA, m_fArea);
}
Прежде всего нужно создать в классе поддержки диалогового окна приложения CTestLibDlg экземпляр ранее разработанного нами класса CCircle, считая, что он доступен тестовому приложению.
В файле TestLibDlg.h добавьте в конец класса CTestLibDlg следующий кодВключение объекта круга в описание класса диалогового окна
// TestLibDlg.h : header file
//
#pragma once
// CTestLibDlg dialog
class CTestLibDlg : public CDialog
{
..................................................
private:
// Переменная для поля радиуса
int m_iRadius;
// Переменная для поля площади
float m_fArea;
CCircle circle;
};
В метод OnInitDialog() класса CTestLibDlg в самый конец перед оператором return добавьте код инициализацииКод инициализации в файле TestLibDlg.cpp
BOOL CTestLibDlg::OnInitDialog()
{
.......................................................
// TODO: Add extra initialization here
m_iRadius = circle.GetRadius();
m_fArea = circle.GetArea();
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
Постройте проект приложения и убедитесь, что оно работает, но пока не хватает функциональностиДальше мы добавим функциональность к элементам управления, а пока наше тестовое приложение после запуска должно выглядеть так

Обратите внимание, что начальный радиус (5) сгенерирован конструктором класса CCircle со значением параметра по умолчанию, которое мы задали ранее при разработке класса.
В режиме дизайна двойным щелчком по кнопке Выход создайте обработчик и внесите в него код завершения приложенияОбработчик кнопки "Выход"
void CTestLibDlg::OnBnClickedButtonExit()
{
// TODO: Add your control notification handler code here
OnOK();
}
В режиме дизайна двойным щелчком по кнопке Решить создайте обработчик и внесите в него кодОбработчик кнопки "Решить"
void CTestLibDlg::OnBnClickedButtonExecute()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
circle.SetRadius(m_iRadius);
m_fArea = circle.GetArea();
UpdateData(FALSE);
}
В режиме дизайна двойным щелчком по кнопке Показать создайте обработчик и внесите в него кодОбработчик кнопки "Показать"
void CTestLibDlg::OnBnClickedButtonDisplay()
{
// TODO: Add your control notification handler code here
OnBnClickedButtonExecute();
circle.DisplayArea();
}
В последнем обработчике мы задействовали код предыдущего обработчика, чтобы показывать в диалоговом окне свежую информацию.
Постройте приложение и убедитесь в его работоспособности
Смените иконку приложения и оформите Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.