You are on page 1of 10

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ОДЕСЬКА ПОЛІТЕХНІКА»


ІНСТИТУТ КОМП’ЮТЕРНИХ СИСТЕМ
КАФЕДРА ІНЖЕНЕРІЇ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ

Лабораторна робота №1
із дисципліни «Компонентно-орієнтована розробка»

Виконав:
ст. ІV курсу гр. АС-201
Поцілуйко В. А.

Перевірила:
ас. Арнаутова О. М.

Посилання на захист:
https://drive.google.com/file/d/1IJPX
zlrquzSYEuGQRgbKPGxPOZ35LE9
Y/view?usp=sharing

Одеса 2023
2

ВСТУП

Мета роботи: отримати навички створення та використання бібліотек DLL


мовою програмування C.
Завдання: з обраної для дипломного проектування предметної області
обрати три підзадачі, пов'язані із бізнес-логікою та реалізувати їх у вигляді DLL.
Предметна область: сервіс для пошуку центрів, що надають послуги з
ремонту комп’ютерного обладнання.
Посилання на захист роботи:
https://drive.google.com/file/d/1IJPXzlrquzSYEuGQRgbKPGxPOZ35LE9Y/view?usp=
sharing
3

1 КОД

1.1 Бібліотека DLL

У лістингу 1.1 наведено код на мові C, який описує бібліотеку DLL з


трьома підпрограмами, які пов'язані із бізнес-логікою предметної області.

Лістинг 1.1 – Код бібліотеки DLL


#include "stdafx.h"
#include <math.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <commdlg.h>

#ifdef _MANAGED
#pragma managed(push, off)
#endif

/* Структура, яка описує місце у вигляді


координат широти та довготи */
typedef struct {
double latitude;
double longitude;
} Location;

/*Константні значення, що необхідні


для географічних розрахунків*/
#define EARTH_RADIUS 6371.0
#define PI 3.1415

//---------------------Початок таблиці експорту DLL-------------------------


#pragma comment (linker, "/export:CalculateDistance=_CalculateDistance@32")
#pragma comment (linker, "/export:GeneratePassword=_GeneratePassword@8")
#pragma comment (linker, "/export:Print=_Print@4")
extern "C" __declspec(dllexport) INT __stdcall CalculateDistance(Location
locationA, Location locationB);
4
extern "C" __declspec(dllexport) void __stdcall GeneratePassword(char* password,
int length);
extern "C" __declspec(dllexport) void __stdcall Print(wchar_t* text);
//-----------------------Кінець таблиці експорту DLL---------------------

//===============Реалізація функцій DLL====================

//Процедура, яка переводить градуси в радіани


double DegreesToRadians(double degrees) {
return degrees * PI / 180.0;
}

//Процедура, яка знаходить відстань у кілометрах між двома точками на планеті


int __stdcall CalculateDistance(Location locationA, Location locationB) {
//Конвертуємо величини
double lat1 = DegreesToRadians(locationA.latitude);
double lon1 = DegreesToRadians(locationA.longitude);
double lat2 = DegreesToRadians(locationB.latitude);
double lon2 = DegreesToRadians(locationB.longitude);

//Застосовуємо формулу гаверсинуса


double dlat = lat2 - lat1;
double dlon = lon2 - lon1;
double a = sin(dlat / 2) * sin(dlat / 2) + cos(lat1) * cos(lat2) * sin(dlon
/ 2) * sin(dlon / 2);
double c = 2 * atan2(sqrt(a), sqrt(1 - a));

//Обчислення відстані
double distance = EARTH_RADIUS * c;
return distance;
}

//Процедура, яка генерує пароль


void __stdcall GeneratePassword(char* password, int length) {
//Задаємо точку для створення ряду випадкових чисел
srand((unsigned int) time(NULL));

//Задаємо набір символів, з яких може складатися пароль


const char charset[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+{}[]|;:
,.<>?";
5

int charset_length = sizeof(charset) - 1;

//Генеруємо пароль
for (int i = 0; i < length; ++i) {
int random_index = rand() % charset_length;
password[i] = charset[random_index];
}

//Додаємо символ завершення рядка


password[length] = '\0';
}

//Процедура, яка дозволяє друкувати текст


void __stdcall Print(wchar_t* text) {
/*Готуємо відомості, які потрібні для
запуску діалогового вікна вибору принтера*/
PRINTDLG pd = {0};
pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_RETURNDC;

//Якщо користувач підтвердив, друкуємо наданий текст


if (PrintDlg(&pd)) {
HDC hdc = pd.hDC;
DOCINFO di = {0};
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = TEXT(DOCUMENT_DSC);

if (StartDoc(hdc, &di) > 0) {


StartPage(hdc);

//Виводимо текст на принтер


TextOutW(hdc, 100, 100, text, wcslen(text));

EndPage(hdc);
EndDoc(hdc);
}

//Вивільняємо задані ресурси


DeleteDC(hdc);
}
6
}

BOOL APIENTRY DllMain(HMODULE hModule,


DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

1.2 Тестувальна програма

У лістингу 1.2 наведено код програми на мові C, яка використовує


бібліотеку DLL з розд. 1.1.

Лістинг 1.2 – Код тестувальної програми


// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Windows.h"
#include <iostream>

typedef struct {
double latitude;
double longitude;
} Location;

HINSTANCE hMyDll;

//Типи, що оголошують покажчики на функції


typedef int (WINAPI *CalculateDistance)(Location, Location);
typedef void (WINAPI *GeneratePassword)(char*, int);
typedef void (WINAPI *Print)(wchar_t*);
7
CalculateDistance calculateDistance;
GeneratePassword generatePassword;
Print print;

int main()
{

//Завантажуємо бібліотеку
hMyDll = LoadLibrary(_T("C:\\Users\\charl\\Documents\\Visual Studio
2015\\Projects\\FirstDll\\Debug\\FirstDll.dll"));

//Якщо завантажити не вдалося, завершуємо роботу програми з кодлом помилки


if (hMyDll == NULL) {
return -1;
}

//Отримуємо покажчики на функції


calculateDistance = (CalculateDistance)GetProcAddress(hMyDll,
"CalculateDistance");
generatePassword = (GeneratePassword)GetProcAddress(hMyDll,
"GeneratePassword");
print = (Print)GetProcAddress(hMyDll, "Print");

//Знаходимо відстань
Location a, b;
a.latitude = 51;
a.longitude = 31;
b.latitude = 47;
b.longitude = 30.73;

std::cout << "Distance between Kyiv and Odesa:" << std::endl;


long distance = (*calculateDistance)(a, b);
std::cout << distance << " km" << std::endl;

std::cout << "New password:" << std::endl;


const int passwordLength = 12;
char password[passwordLength + 1];
(*generatePassword)(password, passwordLength);
std::cout << password << std::endl;

wchar_t txt[] = L"Hello Printer!";


8
(*print)(txt);

std::cin >> distance;

return 0;
}
9

2 ТЕСТУВАННЯ

На рис. 2.1 показано знімок екрану роботи програми. Як видно, програма


успішно запускається та використовує функції із бібліотеки DLL.

Рисунок 2.1 – Результати тестування


10

ВИСНОВОК

На даній лабораторній роботі я отримав навички створення та використання


бібліотек DLL мовою програмування C.

You might also like