- •Лабораторна робота № 5.
- •Теоретичні відомості.
- •Хід виконання роботи.
- •1. Створення проекту dll-бібліотеки.
- •2. Написання коду програми.
- •3. Побудова dll-бібліотеки.
- •4. Створення програми, у якій буде використовуватись dll-бібліотека.
- •Контрольні запитання.
- •Варіанти для індивідуальної роботи.
- •Висновки.
Хід виконання роботи.
Виписуємо необхідні формули:
1) радіус
кола, описаного навколо трикутника:
,
2) радіус
кола, вписаного в трикутник:
,
Допоміжні формули:
3) площа трикутника
:
,
4) периметр трикутника
:
,
5) відстань між точками з
координатами
та
:
.
1. Створення проекту dll-бібліотеки.
Вибираємо консольний проект та задаємо ім’я бібліотеки:
Вибираємо Далі:
Вибираємо Application Type (Тип проекту) – DLL та Finish:
В
менеджері файлів
(Solution
Explorer)
проекту створено файли:
dllmain.cpp – це основна програма, з якої здійснюється запуск бібліотеки.
GeometyFunc.cpp – це файл з функціями бібліотеки.
В першому файлі нічого не пишемо, а в другому – записуємо реалізацію функцій.
2. Написання коду програми.
Текст програми з файлу GeometyFunc.cpp:
#include "stdafx.h"
#include <math.h>
// довжина сторони трикутника
extern "C" __declspec (dllexport) double dist(double x_p, double y_p, double x_k, double y_k)
{
return sqrt( pow((x_k - x_p), 2) + pow((y_k - y_p), 2) );
}
//периметр трикутника
extern "C" __declspec (dllexport) double perum(double side1, double side2, double side3)
{
return side1 + side2 + side3;
}
//площа трикутника
extern "C" __declspec (dllexport) double square(double side1, double side2, double side3)
{
double p = perum(side1, side2, side3);
double s = sqrt(p/2*(p/2-side1)*(p/2-side2)*(p/2-side3));
return s;
}
// радіус описаного кола
extern "C" __declspec (dllexport) double R(double side1, double side2, double side3)
{
return (side1*side2*side3)/(4*square(side1, side2, side3));
}
// радіус вписаного кола
extern "C" __declspec (dllexport) double r(double side1, double side2, double side3)
{
return square(side1, side2, side3)/perum(side1, side2, side3);
}
Текст програми з файлу dllmain.cpp (нічого не змінено):
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
3. Побудова dll-бібліотеки.
Вибираємо Build – Build Solution. В результаті виконання цієї команди одержимо скомпонований dll-файл бібліотеки.
Відкриємо папку з проектом:
Зайдемо у папку Debug, у якій знаходиться dll-файл бібліотеки:
4. Створення програми, у якій буде використовуватись dll-бібліотека.
В менеджері файлів (Solution Explorer) натискаємо праву клавішу миші на назві рішення (Solution ‘GeometryFunc’ (1 project)).
Вибираємо Add – New Project.
Задаємо ім’я консольного проекту:
Далі все без змін.
О
держимо
2 проекти в одному рішенні. Один проект
– це бібліотека, а другий проект – це
програма, яка використовує бібліотеку.
Додамо до основної програми lib-файл бібліотеки. Це потрібно для компоновки основної програми.
Права кнопка на папці Resource Files – Add - Existing Item…
У вікні вибираємо lib-файл та натискаємо Add.
Пишемо текст головної програми:
// GeomProgram.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <conio.h>
#include <iostream>
using namespace std;
// ____________________________ Експорт функцій з Dll ______________________________
// довжина сторони трикутника
extern "C" __declspec(dllimport) double dist(double x_p, double y_p, double x_k, double y_k);
//периметр трикутника
extern "C" __declspec(dllimport) double perum(double side1, double side2, double side3);
//площа трикутника
extern "C" __declspec(dllimport) double square(double side1, double side2, double side3);
// радіус описаного кола
extern "C" __declspec(dllimport) double R(double side1, double side2, double side3);
// радіус вписаного кола
extern "C" __declspec(dllimport) double r(double side1, double side2, double side3);
// _________________________ Основна програма ____________________________________
int _tmain(int argc, _TCHAR* argv[])
{
// координати вершин трикутника
double x1, x2, x3, y1, y2, y3;
// сторони трикутника
double a, b, c;
// вводимо координати
cout << "Vvedit' koordunatu verwun trukytnuka:" << endl;
cout << " x1 = "; cin >> x1;
cout << " y1 = "; cin >> y1;
cout << " x2 = "; cin >> x2;
cout << " y2 = "; cin >> y2;
cout << " x3 = "; cin >> x3;
cout << " y3 = "; cin >> y3;
// обчислюємо сторони
a = dist(x1, y1, x2, y2);
b = dist(x2, y2, x3, y3);
c = dist(x1, y1, x3, y3);
// обчислюємо та виводимо радіуси описаного та вписаного кіл
// використовуємо імпортовані функції з dll-бібліотеки.
cout << "Radiys opusanogo kola = " << R(a, b, c) << endl;
cout << "Radiys vpusanogo kola = " << r(a, b, c) << endl;
_getch();
return 0;
}
Натискаємо праву кнопку миші на проекті GeomProg та вибираємо Set as StartUp Project:
Запускаємо програму: F5.
Результат роботи програми:
Тепер ехе-файл програми можна використовувати разом з dll-файлом.
Для перевірки зайдемо у папку Debug рішення та скопіюємо ці файли в іншу папку:
Програма запускається разом з бібліотекою.
Проте, якщо видалити dll-файл з папки e:\testdll, то програма не запуститься:
