You are on page 1of 8

Міністерство освіти і науки України

Національний університет “Львівська політехніка”


Інститут комп’ютерних наук та інформаційних
технологій

Кафедра САП

Лабораторна робота № 8

Дисципліна: “Об’єктно-орієнтоване програмування”


Тема: “Динамічно під’єднані бібліотеки (DLL)”

Виконав
студент групи ПП-17
Скорохід Тарас А.

Прийняв:Дутка В.Ю.

Львів-2023 р.а
Мета роботи
Ознайомитись з методикою створення та використання dll-бібліотеки.
Завдання 1
Написати програму для виконання геометричних обчислень відповідно до
власного варіанту. Створені функції для реалізації геометричних формул
виділити в dll-бібліотеку.
13. Обчислити об’єм зрізу, якщо відомі радіус кулі, відстань між двома
кулями та радіуси обох перерізів.

DLL library

file “calculation.h”

#pragma once

#ifdef CALCULATION_EXPORTS
#define CALCULATION_API __declspec(dllexport)
#else
#define CALCULATION_API __declspec(dllimport)
#endif

extern "C" CALCULATION_API double calculateSegmentVolume(double r, double d, double


R1, double R2);

file “calculation.cpp”

#include "pch.h"
#define _USE_MATH_DEFINES
#include <utility>
#include <limits.h>
#include "calculation.h"
#include <iostream>
#include<cmath>

using namespace std;

double calculateSegmentVolume(double r, double d, double R1, double R2)


{
double h = (d * d - (R1 - R2) * (R1 - R2) - 4 * r * r) / (2 * d);
double volume = (1.0 / 3) * M_PI * h * h * (3 * r - h);
return volume;
}

Console application
source file
#include <iostream>
#include "calculation.h"

using namespace std;


int main()
{
double r, d, R1, R2;
cout << "Enter the radius of the sphere (r): ";
cin >> r;
cout << "Enter the distance between the two spheres (d): ";
cin >> d;
cout << "Enter the radius of the first section (R1): ";
cin >> R1;
cout << "Enter the radius of the second section (R2): ";
cin >> R2;

double segmentVolume = calculateSegmentVolume(r, d, R1, R2);

cout << "The volume of the segment is: " << segmentVolume << endl;
return 0;

Завдання 2

Створимо DLL-бібліотеку на мові C++ та виклик її функції з Windows-проекту.

1. Створити рішення
2. Створити DLL-бібліотеку, яка містить функції, що необхідні для реалізації
індивідуального завдання.
3. Створити в тому ж рішенні Windows-проект, який викликає ці бібліотечні методи для
виконання необхідних обчислень. Форма для введення вхідних даних та виведення
результатів повинна бути достатньо інформативною, щоб користувачу було зрозуміло,
які саме обчислення і за якими формулами виконуються у програмі.
4. При введенні вхідних даних перевіряти їх на допустимість значень. Наприклад, якщо
використовується операція ділення, перевіряти, щоб знаменник не дорівнював нулю.
Діапазони допустимих значень описати у звіті. Проілюструвати скріншотами роботу
програми на допустимих та недопустимих значеннях вхідних даних (повідомлення про
помилки, або невірно введені дані).

13.
1. Реалізувати функцію перетворення введеного у десятковій системі числення цілого
числа x у довільну систему числення, обрану зі списку (двійкова, вісімкова,
шістнадцяткова). Перевіряти введене число, щоб воно містило лише символи
0,1,2,...,9.
2. Обчислити через ряд Тейлора 1/( 1−х )= ∑ 𝑥 ∞ 𝑛 𝑛=0 x^n для |x|<1. Значення x –
дійсне число, n – ціле (кількість членів ряду). Значення x та n вводяться у формі.
Результат вивести на форму.
3. Обчислити площу довільного трикутника за заданими значеннями його сторін.

DLL:
calculation.h
#pragma once
#include <iostream>
extern "C" __declspec(dllexport)
float triangle(double a, double b, double c);
extern "C" __declspec(dllexport) ;
double taylor(int n, double x);
extern "C" __declspec(dllexport) int binary(int a);
extern "C" __declspec(dllexport) int octal(int a);

calculation.cpp

#include "pch.h"
#include "MYDLL.h"
#include <cmath>
float __stdcall triangle(double a, double b, double c)
{
float p = (a + b + c) / 2;
float result = sqrt(p * ( p - a ) * (p - b) * (p - c));
return result;
}
int factorial(int i)
{
if (i == 0 || i == 1) return 1;
else return i * factorial(i - 1);
}
double __stdcall taylor(int n, double x)
{
double result{};
double formula{};
for (int i = 0; i < n; i++){
formula = (pow(-1, i) * factorial(2 * i) * pow(x, i)) /
((1.0 - (2.0 * (double)i)) *

pow(factorial(i), 2) * pow(4, i));


result += formula;
}
return result;
}
int __stdcall binary(int a) {
int bin = 0, k = 1;
while (a)
{
bin += (a % 2) * k;
k *= 10;
a /= 2;
}
return bin;
}
int __stdcall octal(int a) {
int octalNum = 0, placeValue = 1;
int dNo = a;
while (a != 0) {
octalNum += (a % 8) * placeValue;
a /= 8;
placeValue *= 10;
}
return octalNum;
}

MyFormApp:
Form1:
namespace App
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Triangle_Click(object sender, EventArgs e) {
try
{
double a = double.Parse(textBox3.Text);
double n = double.Parse(textBox1.Text);
double g = double.Parse(textBox2.Text);
textBoxResult1.Text = MyClass.triangle(a, n,
g).ToString(); }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Binary_Click(object sender, EventArgs e) {
try
{
int a = int.Parse(textBox5.Text);
textBoxResult2.Text = MyClass.binary(a).ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void textBoxResult2_TextChanged(object sender,
EventArgs e) {
}
private void Octal_Click(object sender, EventArgs e) {
try
{
int a = int.Parse(textBox5.Text);
textBoxResult2.Text = MyClass.octal(a).ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Taylor_Click(object sender, EventArgs e) {
try
{
int a = int.Parse(textBox8.Text);
double g = double.Parse(textBox7.Text);
textBoxResult3.Text = MyClass.taylor(a,
g).ToString(); }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}

MyClass:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace MyFormApp
{
internal class MyClass {
[DllImport(@E:\way\programing\c++ just for visual
studio\laba_8\DLLlab8\x64\Debug)]
public static extern float triangle(double a, double b, double c);
[DllImport(@"E:\way\programing\c++ just for visual
studio\laba_8\DLLlab8\x64\Debug")]
public static extern double taylor(int n, double x);
[DllImport(@"E:\way\programing\c++ just for visual
studio\laba_8\DLLlab8\x64\Debug\Lab_8.dll")]
public static extern int binary(int a);
[DllImport(@"E:\way\programing\c++ just for visual
studio\laba_8\DLLlab8\x64\Debug\Lab_8.dll")]
public static extern int octal(int a);
}
}
Контрольні запитання
1. Що таке dll-бібліотека?
DLL (Dynamic Link Library) бібліотека - це файл, який містить код і дані, які можуть
бути використані багатьма програмами одночасно. DLL-бібліотеки зберігають функції і
ресурси, які можуть бути викликані зовнішніми програмами.

2. Для чого використовуються dll-бібліотеки?


DLL-бібліотеки використовуються для спільного використання коду і ресурсів між
різними програмами. Вони дозволяють економити простір на диску, оскільки код і
ресурси можуть бути спільно використані без необхідності копіювати їх у кожну
програму окремо. Використання DLL-бібліотек також полегшує оновлення і підтримку
коду, оскільки зміни в DLL-файлі можуть застосовуватися до всіх програм, які його
використовують.

3. Яким чином експортується функція з dll-бібліотеки?


Функція може бути експортована з DLL-бібліотеки шляхом використання ключового
слова або директиви, такої як __declspec(dllexport), у вихідному коді функції. Це
дозволяє зробити функцію доступною для зовнішніх програм, які використовують
DLL-бібліотеку.

4. Яким чином імпортується функція з dll-бібліотеки?


Функція може бути імпортована з DLL-бібліотеки шляхом використання ключового
слова або директиви, такої як __declspec(dllimport), у вихідному коді програми, яка
використовує функцію з DLL. Це дозволяє програмі використовувати функцію, яка
знаходиться у DLL-бібліотеці, як будь-яку іншу функцію.

5. Скрита реалізація за допомогою lib та dll файлів?


Зазвичай, lib-файл (бібліотека імпорту) містить інформацію про функції, які доступні
для імпорту з DLL-бібліотеки. Під час компіляції програми, яка використовує DLL,
lib-файл використовується для забезпечення належного підключення та виклику
функцій з DLL. DLL-файл (бібліотека динамічного зв'язування) містить фактичний
виконуваний код функцій та додаткові ресурси, необхідні для їх виконання. При
виконанні програми, DLL-файл завантажується в пам'ять і може бути використаний
багатьма програмами одночасно.

Висновок :Ознайомився з методикою створення та використання


dll-бібліотеки.

You might also like